Загрузка данных
base.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% endblock %}</title>
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'main/css/base.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'main/css/page2.css' %}">
</head>
<body>
<div class="hat">
<img class="logo" src="{% static 'main/image/logo.jpg' %}" alt="Логотип">
<nav>
<a href="/">Главная</a>
<a href="https://vk.com/">Мы в соц сетях</a>
<a href="/admin">Вход</a>
<a href="add_info/">Добавить фильм</a>
</nav>
</div>
{% block content %} {% endblock %}
</body>
</html>
-------------------------------------------------------------------------------------
home.html:
{% extends 'main/base.html' %}
{% load static %}
{% block content %}
<div class="films_block">
{% for el in table %}
<div class="film">
{% if el.image %}
<img src="{{ el.image.url }}" alt="{{ el.title }}" class="film-image">
{% endif %}
<h2>{{ el.title }}</h2>
<p>{{ el.text }}</p>
</div>
{% endfor %}
</div>
{% endblock %}
-------------------------------------------------------------------------------------
page2.html
{% extends 'main/base.html' %}
{% block title %}
Вторая страница
{% endblock %}
{% block content %}
<div class="add_info">
<h1>Добавить фильм</h1>
<form method="post" enctype="multipart/form-data" class="add-form">
{% csrf_token %}
{{ form.title }}
{{ form.text }}
{{ form.image }}
<button type="submit" class="but">Добавить</button>
</form>
</div>
{% endblock %}
-------------------------------------------------------------------------------------
forms.py
from .models import Table
from django.forms import ModelForm, TextInput, Textarea
from django.forms import ClearableFileInput
class TableForm(ModelForm):
class Meta:
model =Table
fields = ['title', 'text', 'image']
widgets = {
'title': TextInput(attrs={"class": "form_control", "placeholder": "Введите название"}),
'text': Textarea(attrs={"class": "form_control", "placeholder": "Введите описание"}),
'image': ClearableFileInput(attrs={"class": "form_control", "placeholder": "Загрузите картинку"}),
}
-------------------------------------------------------------------------------------
models.py
from django.db import models
from django.forms import ModelForm, TextInput, Textarea, ImageField,ClearableFileInput
class Table(models.Model):
title = models.CharField("Введите название: ", max_length=50)
text = models.TextField("Введите описание: ")
image = models.ImageField(
"Загрузите изображение",
upload_to='table_images/',
null=True,
blank=True
)
def __str__(self):
return self.title
class Meta():
verbose_name = "Table"
verbose_name_plural = "Tables"
class TableForm(ModelForm):
class Meta:
model = Table
fields = ["title" , "text" , "image"]
widgets = {
"title": TextInput(attrs={"class": "form-control", "placeholder": "Введите название"}),
"text": Textarea(attrs={"class": "form-control", "placeholder": "Введите описание"}),
'image': ClearableFileInput(attrs={"class": "form_control", "placeholder": "Загрузите картинку"}),
}
-------------------------------------------------------------------------------------
views.py
def add_info(request):
if request.method == 'POST':
form = TableForm(request.POST, request.FILES) # обязательно request.FILES
if form.is_valid():
form.save()
return redirect('home')
else:
form = TableForm()
return render(request, 'main/page2.html', {'form': form})
-------------------------------------------------------------------------------------
base.css
body {
background-color: #1f1f1f; /* добавлен # для корректного цвета */
background-image: url("../image/cat.jpg");
background-repeat: no-repeat;
background-size: 100%;
padding-top: 100px; /* отступ, чтобы контент не залезал под абсолютную шапку */
margin: 0; /* убираем возможные браузерные отступы */
}
/* Шапка */
.hat {
position: absolute;
top: 0;
left: 0;
background-color: rgba(255, 255, 255, 0.5);
width: 100%;
height: 70px;
display: flex; /* выравниваем логотип и навигацию в строку */
align-items: center; /* вертикальное центрирование */
justify-content: space-between; /* логотип слева, навигация справа */
padding: 0 20px; /* небольшие боковые отступы */
box-sizing: border-box;
z-index: 10; /* шапка поверх контента, если нужно */
}
/* Логотип – без гигантских смещений */
.logo {
height: 50px; /* или подгони под реальный размер */
width: auto;
position: static; /* отменяет наследуемый absolute, если был */
}
/* Навигация – убираем принудительный левый сдвиг */
nav {
display: flex;
gap: 15px; /* расстояние между ссылками */
flex-wrap: wrap; /* чтобы ссылки не вылезали на маленьких экранах */
justify-content: flex-end;
}
/* Ссылки */
a {
color: black;
font-size: 20px;
font-family: "Comic Sans MS", cursive, sans-serif;
display: inline-block;
border: 2px solid rgba(255, 255, 255, 0.5);
padding: 8px 12px;
border-radius: 10px;
text-decoration: none;
white-space: nowrap;
}
a:hover {
animation: UpScale 0.5s forwards;
}
@keyframes UpScale {
0% {
transform: scale(1);
box-shadow: 0px 20px 40px rgba(0, 0, 0, 0);
}
100% {
transform: scale(1.03);
box-shadow: 0px 20px 40px rgba(0, 0, 0, 0.5);
}
}
/* --- Контейнер с фильмами --- */
.films_block { /* исправлен селектор (точка) */
margin-top: 30px; /* дополнительный отступ от шапки, если нужно */
padding: 20px;
display: flex;
flex-direction: column;
align-items: center; /* центрируем карточки */
gap: 25px;
}
/* Карточка фильма */
.film {
width: 650px;
max-width: 90%; /* чтобы на узких экранах не вылезало */
padding: 20px;
background-color: #3a65a6;
border-radius: 25px;
color: white; /* белый текст на синем фоне – так читаемее */
position: relative; /* если понадобятся внутренние абсолютные элементы */
box-shadow: 0 4px 15px rgba(0,0,0,0.3);
}
/* Заголовок фильма – теперь в потоке */
.film h2 {
color: #ffffff;
font-size: 26px;
font-family: "Comic Sans MS", cursive, sans-serif;
margin: 0 0 10px 0;
text-align: center;
}
/* Описание фильма – в потоке */
.film p {
color: #e0e0e0;
font-size: 18px;
font-family: "Comic Sans MS", cursive, sans-serif;
line-height: 1.5;
margin: 0;
}
/* --- Элементы, которые ты использовал на других страницах (panel, cat) --- */
/* оставляем, но они не должны портить главную */
.panel {
position: absolute;
width: 400px;
height: 600px;
background-color: rgba(255, 255, 255, 0.5);
top: 150px;
left: 100px;
animation: Pulse 2s ease infinite;
}
.cat {
position: absolute;
width: 500px;
height: 800px;
background-color: rgba(255, 255, 255, 0.5);
top: 150px;
left: 800px;
}
@keyframes Pulse {
0% {
transform: scale(1);
box-shadow: 0px 20px 60px rgba(255, 255, 255, 0.5);
}
50% {
transform: scale(1.02);
box-shadow: 0px 20px 60px rgba(255, 255, 255, 0.5);
}
100% {
transform: scale(1);
box-shadow: 0px 20px 60px rgba(255, 255, 255, 0.5);
}
}
.film-image {
max-width: 100%;
height: auto;
border-radius: 10px;
margin-bottom: 15px;
display: block;
}
-------------------------------------------------------------------------------------
page2.css
/* === Контейнер формы === */
.add_info {
max-width: 650px;
margin: 50px auto 0 auto; /* центрируем блок */
padding: 30px 40px;
background-color: rgba(255, 255, 255, 0.85); /* полупрозрачный белый, как у шапки */
border-radius: 20px;
box-shadow: 0px 20px 60px rgba(0, 0, 0, 0.5); /* тень для глубины */
}
/* Заголовок внутри блока */
.add_info h1 {
color: #1c5e2b;
font-size: 28px;
font-family: "Comic Sans MS", cursive, sans-serif;
text-align: center;
margin-bottom: 30px;
/* Переопределяем глобальные свойства, которые могли быть absolute и т.п. */
position: static;
left: auto;
top: auto;
}
/* === Поля ввода === */
.form_control {
display: block;
width: 100%;
padding: 12px 15px;
margin-bottom: 20px;
font-size: 18px;
font-family: "Comic Sans MS", cursive, sans-serif;
border: 2px solid rgba(28, 94, 43, 0.3); /* зеленоватая рамка */
border-radius: 10px;
background-color: rgba(255, 255, 255, 0.9);
color: #1f1f1f;
box-sizing: border-box;
transition: border-color 0.3s, box-shadow 0.3s;
}
.form_control:focus {
outline: none;
border-color: #1c5e2b;
box-shadow: 0 0 8px rgba(28, 94, 43, 0.4);
}
/* Стили для textarea – такая же ширина и высота побольше */
textarea.form_control {
min-height: 120px;
resize: vertical;
}
/* Стили для поля выбора файла (браузерный стандарт) */
input[type="file"].form_control {
padding: 10px;
cursor: pointer;
}
/* === Кнопка === */
.but {
display: block;
width: 100%;
padding: 14px;
font-size: 22px;
font-family: "Comic Sans MS", cursive, sans-serif;
color: white;
background-color: #1c5e2b; /* тёмно-зелёная, как твой текст */
border: none;
border-radius: 12px;
cursor: pointer;
margin-top: 10px;
transition: background-color 0.3s, transform 0.2s, box-shadow 0.2s;
}
.but:hover {
background-color: #2a7a38;
transform: scale(1.02);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
}
.but:active {
transform: scale(0.98);
}