Django Imagefield 无法通过 ModelForm 正常工作

Posted

技术标签:

【中文标题】Django Imagefield 无法通过 ModelForm 正常工作【英文标题】:Django Imagefield not working properly via ModelForm 【发布时间】:2010-10-15 09:52:15 【问题描述】:

我确定我在做一些很明显很愚蠢的事情,但我已经尝试了几个小时了,但没有任何反应。

我正在使用 ModelForm,因此我可以从模型中公开一些字段以进行编辑。 2 个图像字段,1 个文本字段。表单被处理并且 TextField 工作。这两个 ImageField 不起作用,这就是我今天在这里的原因。

我正在使用 Django 1.0.2

这是相关代码(询问您是否需要更多代码——我没有包括 html,因为该部分似乎可以正常工作):

型号:

class Company(models.Model):
    #...
    logo = models.ImageField(upload_to='logos', blank=True)
    intro_pic = models.ImageField(upload_to='intropics', blank=True)
    intro_text = models.TextField(blank=True)

视图和表单:

def admin_edit(request, company_slug):
    company = get_object_or_404(Company, slug = company_slug)

    f = AdminEditForm(instance = company)
    if request.method == 'POST':
        f = AdminEditForm(request.POST, instance = company)
        if f.is_valid():
            print "Processing form"
            print f.cleaned_data['intro_pic']
            f.save()

    return render_to_response('uadmin/edit.html', 'company':company, 'f':f, RequestContext(request))


class AdminEditForm(ModelForm):
    class Meta:
        model = Company
        fields = ['logo', 'intro_pic', 'intro_text']

【问题讨论】:

【参考方案1】:

这发生在我身上,因为我缺少文件输入的“名称”属性。

【讨论】:

【参考方案2】:

我觉得自己像个白痴。为了让 Django 能够处理上传的文件,您需要将 request.FILES 变量传递给表单(有意义,对吧?!)

在我的情况下,以下行来自:

f = AdminEditForm(request.POST, instance = company)

收件人:

f = AdminEditForm(request.POST, request.FILES, instance = company)

要检查的另一件事(如果您将来遇到类似的事情)是您的表单是多部分的。你的<form> 标签应该是这样的:

<form enctype="multipart/form-data" method="post" action="">

【讨论】:

谢谢!就我而言,我错过了enctype="multipart/form-data" 部分 这是一件非常容易错过的事情。从那以后,我发现让 Crispy 处理我的表单标签(以及其他事情)会有所帮助。

以上是关于Django Imagefield 无法通过 ModelForm 正常工作的主要内容,如果未能解决你的问题,请参考以下文章

python/django - “无法使用 ImageField,因为没有安装 Pillow”

ImageField / FileField Django表单目前无法修剪文件名的路径

Django - 无法为具有动态 upload_to 值的 ImageField 创建迁移

将通过 ajax 上传的文件保存到 Django 模型 ImageField

通过 .update() ORM 更新 Django ImageField

来自 Django 中 ImageField 的图像不会加载到模板中