Корректное заполнение поля FileInput (ModeForm, Django)
Разрабатываю тренировочное приложение-библиотеку фильмов, и застряла на моменте добавления нового фильма в БД.
Вот сама модель фильма:
class Film(models.Model):
name = models.CharField(unique=True, max_length=100)
year = models.IntegerField(null=True, default=None)
duration = models.IntegerField()
desc = models.TextField(max_length=300)
slug = models.SlugField(unique=True, null=True, default=None)
actors = models.ManyToManyField(Actor)
ganres = models.ManyToManyField(Ganre)
poster = models.FileField(upload_to='posters/', null=True, default=None)
file = models.FileField(upload_to='films/', null=True, default=None)
def __str__(self):
return self.name
Вот форма для добавления:
class FilmsForm(ModelForm):
class Meta:
model = models.Film
fields = ['name', 'slug', 'year', 'ganres', 'actors', 'desc', 'poster', 'file']
widgets = {
'name': TextInput(attrs={
'class': 'form-control',
'placeholder': 'Название',
'id': 'film_name',
'label': 'Название фильма'
}),
'slug': TextInput(attrs={
'class': 'form-control',
'placeholder': 'SLUG',
'id': 'film_slug'
}),
'year': NumberInput(attrs={
'class': 'form-control',
'placeholder': 'Год',
'id': 'film_year'
}),
'ganres': SelectMultiple(attrs={
'class': 'form-control',
'placeholder': 'Жанры',
'id': 'film_ganres'
}),
'actors': SelectMultiple(attrs={
'class': 'form-control',
'placeholder': 'Актеры',
'id': 'film_actors'
}),
'desc': Textarea(attrs={
'class': 'form-control',
'placeholder': 'Описание',
'cols': 30,
'rows': 10,
'id': 'film_description'
}),
'poster': FileInput(),
'file': FileInput()
}
Вот соответствующий этой форме шаблон:
<form class="cu_film_form" id="cu_film_form" method="post">
{% csrf_token %}
<div class="field_container">
<label>НАЗВАНИЕ</label>
{{ form.name }}
</div>
<div class="field_container">
<label>SLUG</label>
{{form.slug}}
</div>
<div class="field_container">
<label>ГОД</label>
{{form.year}}
</div>
<div class="field_container">
<label>ЖАНРЫ</label>
{{form.ganres}}
</div>
<div class="field_container">
<label>АКТЕРЫ</label>
{{form.actors}}
</div>
<div class="field_container">
<label>ОПИСАНИЕ</label>
{{form.desc}}
</div>
<div class="field_container">
<label>Загрузить постер{{ form.poster }}</label>
<label>Загрузить файл{{ form.file }}</label>
</div>
<span>{{status}}</span>
<div class="cu_form_actions">
<button id="save_film_changes" name="save_film_changes" type="submit"></button>
<button id="discard_film_changes" name="discard_film_changes" type="reset"></button>
</div>
</form>
И вот view для самого добавления:
def film_creation(request):
form = FilmsForm()
status = ''
if request.method == 'POST':
for name in request.POST:
print("{}: {}".format(name, request.POST.getlist(name)))
print()
form = FilmsForm(request.POST)
if form.is_valid():
film = form.save(commit=False)
print('form saved!')
file = form.cleaned_data['file']
print('file getted!')
frames = file.get(cv2.CAP_PROP_FRAME_COUNT)
print('frames counted')
fps = file.get(cv2.CAP_PROP_FPS)
print('fps counted')
film.duration = (round(frames / fps))//60
print('duration counted')
checked_ganres = (ganre for ganre in Ganre.objects.all() if ganre.id in request.POST.getlist('ganres'))
print(checked_ganres)
film.save()
print(film)
status = 'OK'
else:
for field, errors in form.errors.items():
for error in errors:
status += field + ": " + str(error)
context_dict = {
'ganres': Ganre.objects.all(),
'actors': Actor.objects.all(),
'form': form,
'status': status
}
return render(request, 'film_catalog/create_update_film.html', context=context_dict)
Проблема вот в чем: форма не проходит валидацию. В коде view видно, что я вывожу список полей с проблемами, и получаю следующую картину:
Если я правильно понимаю, то программа хочет, что бы поля poster и file были заполнены. Но, я их точно выбираю (в коде view специально цикл ввела до валидации формы, что бы проверить, что данные были переданы):
Подскажите пожалуйста, как правильно заполнить форму с учетом полей типа FileInput?