如何通过ModelForm添加Django模型的FileField新实例?

4 投票
2 回答
2761 浏览
提问于 2025-04-16 14:01

我是一名Django初学者。我觉得我的问题很简单,但我就是解决不了。

我有一个叫做Document的模型,里面有一个FileField字段:

class Document(models.Model):
    file = models.FileField(upload_to="documents")
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    category = models.ForeignKey(DocumentCategory)
    title = models.CharField(max_length=255, unique=True)
    description = models.TextField()

    def __unicode__(self):
        return self.title

我想通过这个ModelForm来添加一个新的实例:

class DocumentForm(ModelForm):
    class Meta:
        model = Document

在views.py文件中,我有:

def add_document(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/')
        else:
            return render_to_response('add_document.html', {'form':form}, context_instance=RequestContext(request))
    else:
        form = DocumentForm()
    return render_to_response('add_document.html', {'form':form}, context_instance=RequestContext(request))

这个的模板(也就是add_document.html):

{% extends "base.html" %}
{{block content %}
<form enctype="multipart/form-data" method="post" action="">{% csrf_token %}
{{form}}
<input type="submit" value="Add document" />
</form>
{% endblock %}

在管理界面中,添加模型到数据库是正常工作的,文件也能正确上传到"upload_to"指定的位置。但我的表单却不行。当我尝试提交表单时,出现了Filefield error: "This field is required!"的错误。在没有FileField的情况下,这个功能之前是可以正常工作的。

我使用的是Django 1.2.5。我已经折腾了3天,还是没解决!我很绝望。抱歉我的表达。请帮帮我!

2 个回答

0

在你的文档模型中,你设置了文件上传到“documents”这个地方,但具体上传到哪里呢?

也许这个链接能帮到你。

0

现在来说,文件是必须的。你是在尝试不带文件保存表单吗?
如果你想让文件变成可选的,你需要这样定义:

class Document(models.Model):
    file = models.FileField(upload_to="documents", blank=True, null=True)

另外,表单中的 action 参数可能不太对。
它应该是一个网址;通常在 Django 中,你会想要写 ".",而不是完全空的字符串 ("")。不过,我不确定这是否会造成问题。

撰写回答