为什么我的Django表单继续说"这个字段是必需的"

时间:2015-03-03 20:10:45

标签: django django-forms

有人知道为什么我的表单(filepicker)在更简单的版本中工作时会不断返回“此字段是必需的”吗?

我的观点是

def add_attempt(request, m_id, a_id):
    template = loader.get_template('add_attempt.html')
    if request.method == 'POST':
        import pprint 
        pprint.pprint(request.POST)
        pprint.pprint(request.FILES)
        form = UploadAttemptForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            form.instance.pub_date = datetime.datetime.now()
            form.instance.user_id = request.user
            form.instance.assignment = m.Assignment.objects.get(id=a_id)
            form.save()
            return HttpResponseRedirect(reverse('assignment', args=(m_id, a_id)))
        else:
            print form.errors
    else:
        form = UploadAttemptForm()
    context = RequestContext(request, 
        {
        'form':form,
        })
    return HttpResponse(template.render(context))

我的模特是

class Attempt(models.Model):
    user_id = models.ForeignKey(User)
    pdf_filename = models.FileField(storage=settings.S3_STORAGE, upload_to='pdfs')
    pub_date = models.DateTimeField('date uploaded')
    assignment = models.ForeignKey(Assignment)

我的表格是

class UploadAttemptForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(UploadAttemptForm, self).__init__(*args, **kwargs)

    class Meta():
        model = Attempt
        fields = ['pdf_filename',]

错误打印为

`<QueryDict: {u'submit': [u'Upload Attempt'], u'pdf_filename': [u'something.pdf']}>`

<MultiValueDict: {}>     <ul class="errorlist"><li>pdf_filename<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

2 个答案:

答案 0 :(得分:3)

将我的评论添加为正确答案:

请尝试将enctype= multipart/form-data添加到模板文件中的<form>元素。

如果您没有此元素,则request.FILES将始终为空。

https://docs.djangoproject.com/en/1.7/topics/http/file-uploads/#basic-file-uploads复制:

  

请注意,request.FILES只会在请求方法为POST并且发布请求的<form>具有属性enctype="multipart/form-data"时才包含数据。否则,request.FILES将为空。

答案 1 :(得分:0)

如果models.py中需要该字段(即您尚未说明blank=Truenull=True),并且您使用的是ModelForm,则该字段将是ModelForm

中的必填字段