#django #file-upload
#django #загрузка файла
Вопрос:
Я много искал в Google. Я обнаружил, что мне нужно добавить enctype=»multipart / form-data» в форму, но она по-прежнему не работает. Везде, когда я хочу получить этот файл, он просто нулевой. Все остальное работает так, как я исключил. Вот мой код:
home.html
{% extends 'base_template.html' %}
{% block content %}
<h1> Welcome to the home jd! </h1>
<form action = "{% url 'home' %}" method = "post"
enctype="multipart/form-data">
{% csrf_token %}
{{form}}
<input type = "submit" value = "add new track">
</form>
{{message}}
{% endblock %}
Вид:
class home(View):
template_src = "home.html"
def get(self, request):
form = forms.AddTrack()
return render(request, self.template_src, {'form': form})
def post(self, request):
form = forms.AddTrack(request.POST)
print(request.POST) # Here fileupload field is also blank
if form.is_valid():
record = form.save(commit=False)
record.author = request.user
record.save()
form.clean()
return render(request, self.template_src, {'message':
'Added new track!', 'form': form})
else:
return render(request, self.template_src, {'message':
'Incorrect input!', 'form': form})
Модель:
class Track(models.Model):
title = models.CharField(max_length=40, null=True)
description = models.CharField(max_length=500, null=True)
author = models.ForeignKey(User, default=None,
on_delete=models.CASCADE)
audio_or_video = models.FileField(upload_to='audio_and_video/',
default="file_not_found", validators=[validate_file_extension])
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
validators.py
def validate_file_extension(value):
import os
from django.core.exceptions import ValidationError
ext = os.path.splitext(value.name)[1]
valid_extensions = ['.mp4', '.wav', '.webm', '.mp3']
print(os.path.splitext(value.name)) #it prints('file_not_found') models.py default value)
if not ext.lower() in valid_extensions:
raise ValidationError(u'unsupported file extension.')
форма:
class AddTrack(forms.ModelForm):
class Meta:
model = models.Track
fields = ['title', 'description', 'audio_or_video']
widgets = {
'description': Textarea(attrs={'cols': 30, 'rows': 10}),
}
def clean_title(self):
print("clean title method")
Ответ №1:
Просто, но мы всегда пропускаем это в вашем методе post в этой строке form = forms.AddTrack(request.POST)
, которую вы request.FILES
также должны добавить, так и должно быть form = forms.AddTrack(request.POST, request.FILES)
.Я думаю, это должно решить проблему
Также после record.save()
того, почему вы звоните form.clean()
, не должно ли это быть form.save()
вместо этого?
Комментарии:
1. Спасибо за помощь, я проверю, работает ли это и ваш ответ. Я вызывал form.clean, потому что я играл с clean_<имя_поля> в forms.py