我在Google搜索了很多东西。我发现我需要将enctype =“ multipart / form-data”添加到表单,但是仍然无法正常工作。无论何时何地,只要我想获取此文件,它都为null。其他一切都按我的规定进行。这是我的代码:
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")
答案 0 :(得分:2)
很简单,但是我们总是在此行form = forms.AddTrack(request.POST)
的post方法中错过它,您还必须添加request.FILES
,所以它也必须是form = forms.AddTrack(request.POST, request.FILES)
。我想这应该可以解决问题
还在record.save()
之后为什么要打电话给form.clean()
而不是form.save()
?