我的测试表单有问题,即使我尝试了很多方法,它也不会接受文件上传,它只是返回文件上传字段不能为空的错误:
AssertionError: False is not true : <ul class="errorlist"><li>file<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
测试.py:
def test_applicant_form(self):
placements = Position.objects.filter(published=True)[0]
client = Client()
file = File(open('root/static/applications/file.pdf', 'rb'))
data_set = {'name': 'Caleb', 'surname': 'Dvorszky',
'phone_number': '+1963124575', 'city': 'Kansas City', 'country': 'United States', 'message': 'Would like to be there', 'file':file}
form = ApplicantForm(data=data_set)
self.assertTrue(form.is_valid(), form.errors)
甚至尝试过:
response = client.post(placements.get_absolute_url,data=data_set, content_type='multipart/form-data')
但仍然不起作用。
这是表格.py
class ApplicantForm(forms.ModelForm):
name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control form-control-lg'}))
surname = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control form-control-lg'}))
phone_number = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control form-control-lg'}))
city = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control form-control-lg'}))
country = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control form-control-lg'}))
message = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control form-control-lg'}))
file = forms.FileField(widget=forms.FileInput())
class Meta:
model = Candidate
exclude = ['position', 'seen']
型号.py这是在表单中填写数据时需要保存的模型
class Applicant(models.Model):
date = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=100)
surname = models.CharField(max_length=100)
phone_number = models.CharField(max_length=100)
city = models.CharField(max_length=100)
country = models.CharField(max_length=100)
position = models.ForeignKey(
Position, on_delete=models.CASCADE,
related_name='applicants')
cover_letter = models.TextField()
file = models.FileField(upload_to='files/applications')
seen = models.BooleanField(default=False, editable=False)
ADMIN_DISPLAY = ['get_name', 'position', 'city', 'country', 'get_file', 'date']
def get_name(self):
return "%s %s" % (self.name, self.surname)
get_name.short_description = 'Name'
def get_file(self):
return '<a href="%s%s" target="_blank">Download</a>' % (
settings.BASE_DOMAIN_URL, self.file.url)
get_file.allow_tags = True
get_file.short_description = 'Download file'
这是views.py,只是组成部分:
if request.method == 'POST':
form = ApplicantForm(request.POST, request.FILES)
if form.is_valid():
applicant = form.save(commit=False)
applicant.position = placement
applicant.save()
notification(applicant)
messages.info(request, 'We received your application. See you soon!')
return redirect('postions:position-post', placement.slug)
form = ApplicantForm()
您似乎没有正确地传入文件。此外,您似乎试图访问表单中未定义的data
关键字参数。试试这个:记住从django.core.files.uploadedfile 导入`SimpleUploadedFile
from django.core.files.uploadedfile import SimpleUploadedFile
def test_applicant_form(self):
placements = Position.objects.filter(published=True)[0]
with open('root/static/applications/file.pdf', 'rb') as file:
document = SimpleUploadedFile(file.name, file.read(), content_type='application/pdf')
data_set = {'name': 'Caleb',
'surname':'Dvorszky',
'phone_number': '+1963124575',
'city': 'Kansas City',
'country':'United States',
'message': 'Would like to be there',
}
form = ApplicantForm(data_set, {'file': document})
self.assertTrue(form.is_valid(), form.errors)
请查看此测试链接以获取更多信息。您也可以在django 测试文件上传时查看此链接