Не выполняется сохранение данных формы в БД
Не могу определить, в чем конкретно проблема. Есть форма:
<form class="form-cr" action="{% url 'events:create_event' %}" method="post" enctype="multipart/form-data" id="MyForm">
{% csrf_token %}
<div class="cont-a">
<div class="name name">
<label for="id_title">Название*</label>
<input class="inner-input" type="text" name="title" id="id_title" placeholder="Введите название" required autocomplete="off" value="{% if form.title.value %}{{ form.title.value}}{% endif %}">
</div>
<div class="url name">
<label for="id_slug">Url-адрес*</label>
<input class="inner-input" type="text" id="id_slug" name="slug" placeholder="Заполняется автоматически" value="{% if form.slug.value %}{{ form.slug.value}}{% endif %}">
</div>
<div class="input-file-row">
<div>Изображение*</div>
<label class="input-file" for="image-input">
<div class="input-caption">Вставьте изображение</div>
<input class="inner-input-file" type="file" name="poster" id="image-input" value="{% if form.poster.url %}{{ form.poster.url }}{% endif %}" accept="image/*">
</label>
<div class="upload-preview" id="upload-preview-div">
<img class="upload-preview-img" src="{{ form.poster.url }}" alt="" id="image-preview" style="display: none;">
</div>
</div>
<div class="description name">
<label for="id_description">Описание</label>
<input class="inner-input" type="text" name="description" id="id_description" placeholder="Краткое описание" value="{% if form.description.value %}{{ form.description.value}}{% endif %}">
</div>
<button class="enter__btn" type="submit">Создать</button>
</div>
<div class="cont-b">
<div class="age name">
<label for="id_age">Возраст</label>
<select class="select-age" name="age" id="id_age">
{% if form.age.value %}
<option value="">{{ form.age.value }}</option>
{% endif %}
<option value="">Выберите значение</option>
<option value="6+">6+</option>
<option value="12+">16+</option>
<option value="18+">18+</option>
</select>
</div>
<div class="genre name">
<label for="id_genre">Жанр</label>
<select class="select-genre" id="id_genre" name="genre">
{% if form.genre.value %}
<option value="">{{ form.genre.value }}</option>
{% endif %}
<option value="">Выберите значение</option>
<option value="Классика">Классика</option>
<option value="Драма">Драма</option>
<option value="Комедия">Комедия</option>
<option value="Детектив">Детектив</option>
</select>
</div>
<div class="date-day name">
<label for="id_day">Когда*</label>
<input class="time-inp" type="number" name="day" id="id_day" placeholder="день" required value="{% if form.day.value %}{{ form.day.value}}{% endif %}">
<input class="time-inp" type="text" name="month" placeholder="месяц" required value="{% if form.month.value %}{{ form.month.value}}{% endif %}" id="id_month">
<input class="time-inp" type="text" name="hours" placeholder="время чч:мм" required value="{% if form.hours.value %}{{ form.hours.value}}{% endif %}" id="id_hours">
</div>
</div>
</form>
Представление:
def edit_event(request, slug, day, month, hours):
if not request.user.has_perm('events.change_events'):
raise PermissionDenied
event = Events.objects.get(slug=slug, day=day, month=month, hours=hours)
if request.method == 'POST':
form = EventForm(request.POST, request.FILES, instance=event)
if form.is_valid():
form.save()
return redirect('events:home')
else:
form = EventForm(instance=event)
context = {
'title': 'Event - Edit',
'form': form,
'event': event
}
return render(request, 'events/edit_event.html', context)
При нажатии на "Создать" выполняется ф-я "create_event", но данные в базу данных не передаются, и не выполняется редирект, следующий после "form.save()" Консоль выдает просто: "POST /events/create-event/ HTTP/1.1" 200 56891
Все дело оказалось в forms.py
:
class EventForm(forms.ModelForm):
title = forms.CharField()
slug = forms.SlugField()
poster = forms.FileField()
description = forms.CharField(required=False)
age = forms.CharField(required=False)
genre = forms.CharField(required=False)
day = forms.IntegerField()
month = forms.CharField()
hours = forms.CharField()
class Meta:
model = Events
fields = (
'title',
'slug',
'poster',
'description',
'age',
'genre',
'day',
'month',
'hours'
)
ModelForm по умолчанию делает все поля обязательными, даже если в модели указано blank=True
и null=True
, чтобы поля были необязательными надо явно это указать: required=False