Когда форма Django недействительна, почему только ввод типа файла остается?
Если после отправки моей Django Form есть недействительное поле, другие поля имеют входные значения при отправке, но только входные значения типа файла будут опустошены. Я не думаю, что в Dajngo нужно что-то менять. Возможно, это особенность html ввода типа файла?
Например, моя форма сжимает видеофайлы, загруженные пользователями. И это занимает довольно много времени. Если после отправки формы что-то пойдет не так, пользователь должен снова выбрать файл и продолжить процесс сжатия. Это не очень хорошо.
Forms.py
class VideoArtUploadForm(forms.ModelForm):
class Meta:
model = models.VideoArt
fields = (
"video",
"thumbnail",
"poster",
"title",
"year",
"artist",
"description",
)
widgets = {
"video": forms.FileInput(attrs={"accept": "video/mp4"}),
"title": forms.TextInput(attrs={"placeholder": "Il titolo del video"}),
"year": forms.TextInput(
attrs={"placeholder": "l'anno in cui il video è uscito"}
),
"artist": forms.TextInput(attrs={"placeholder": "Il nome di artista"}),
"description": forms.Textarea(
attrs={"placeholder": "una descrizione del video "}
),
}
def clean_thumbnail(self):
thumbnail = self.cleaned_data.get('thumbnail')
if thumbnail:
if thumbnail.size > 10*1024*1024:
raise forms.ValidationError("Thumnail si deve essere meno di 10MB")
return thumbnail
else:
raise forms.ValidationError("Thumnail è necessario")
def clean_poster(self):
poster = self.cleaned_data.get('poster')
if poster and (type(poster) != str):
if poster.size > 10*1024*1024:
raise forms.ValidationError("Cover image si deve essere meno di 10MB")
return poster
def clean_video(self):
video = self.cleaned_data.get("video")
if video and (type(video) != str):
if video.size > 1000*1024*1024:
raise forms.ValidationError("Il video si deve essre meno di 1GB")
return video
def save(self, *args, **kwargs):
videoart = super().save(commit=False)
video = self.cleaned_data.get("video")
video_path = video.temporary_file_path()
get_duration = subprocess.check_output(['ffprobe', '-i', f'{video_path}', '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")])
duration = int(float(get_duration.decode('utf-8').replace("\n", "")))
videoart.duration = duration
return videoart
Views.py
class VideoArtUpload(user_mixins.MoiveUploadPermissionView, FormView):
"""VideoartUpload View Definition"""
form_class = forms.VideoArtUploadForm
template_name = "videoarts/videoart_upload.html"
def form_valid(self, form):
videoart = form.save()
videoart.user = self.request.user
videoart.save()
return redirect(reverse("videoarts:detail", kwargs={"pk": videoart.pk}))
Шаблон загрузки - форма
<form id="upload_video_form" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
{% include "../mixins/nonefield_error.html" %}
{% endfor %}
{% endif %}
<div class="upload_form__sections">
<div class="video-section">
{% for field in form %}
<div class="upload_form_field">
<div class="upload_form_label">{{field.label}}</div>
{{field}}
{% if field.errors %}
{% for error in field.errors %}
{% include "../mixins/field_error.html" %}
{% endfor %}
{% endif %}
</div>
{% endfor %}
<div class="upload_submit">
<button>Carica</button>
<div id="progress" hidden>
<span id="progress_bar"></span>
</div>
</div>
</div>
</div>
</form>