首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django ModelForm包含模型中没有的额外字段

Django ModelForm包含模型中没有的额外字段
EN

Stack Overflow用户
提问于 2010-02-09 20:44:42
回答 7查看 46.3K关注 0票数 60

我做了一个ModelForm,在模型中添加了一些不是的额外字段。在保存表单时,我使用这些字段进行一些计算。

额外的字段出现在表单上,并在上传表单时在POST请求中发送。问题是,当我验证表单时,它们没有添加到cleaned_data字典中。我如何访问它们?

EN

回答 7

Stack Overflow用户

发布于 2014-04-29 08:13:53

编辑2020 (Django 2或更高版本)

在Django 2+中,你可以像这样添加额外的字段:

代码语言:javascript
复制
class ProfileForm(forms.ModelForm):
    
    extra_field = forms.ImageField()

    class Meta:
        model = User
        fields = ['username', 'country', 'website', 'biography']

原始答案(Django 1)

可以使用额外的字段扩展Django ModelForm。假设你有一个自定义的用户模型和这个ModelForm

代码语言:javascript
复制
class ProfileForm(forms.ModelForm):

    class Meta:
        model = User
        fields = ['username', 'country', 'website', 'biography']

现在,假设你想包括一个额外的字段(不在你的用户模型中,比方说一个图像头像)。通过执行以下操作扩展表单:

代码语言:javascript
复制
from django import forms

class AvatarProfileForm(ProfileForm):

    profile_avatar = forms.ImageField()

    class Meta(ProfileForm.Meta):
        fields = ProfileForm.Meta.fields + ('profile_avatar',)

最后(假设表单有一个ImageField),记住在视图中实例化表单时要包含request.FILES

代码语言:javascript
复制
# (view.py)

def edit_profile(request):
    ...
    form = AvatarProfileForm(
        request.POST or None, 
        request.FILES or None, 
        instance=request.user
    )
    ...

希望能有所帮助。祝好运!

编辑:

我在AvatarProfileForm.Meta.fields属性中得到一个“只能连接元组(不能连接"list")到元组”错误。将其更改为元组,它起作用了。

票数 41
EN

Stack Overflow用户

发布于 2018-10-04 17:09:04

我有一个非常类似的问题,只是看起来我做了所有需要做的事情,但当Django启动时,我得到了这个错误:

代码语言:javascript
复制
django.core.exceptions.FieldError: Unknown field(s) (my_new_field) specified for MyModel

这是我犯的一个愚蠢的错误,我不小心使用了窗口小部件类声明了我的字段:

代码语言:javascript
复制
class MyForm(forms.ModelForm):
    my_new_field = forms.HiddenInput()

而不是字段类:

代码语言:javascript
复制
class MyForm(forms.ModelForm):
    my_new_field = forms.CharField(widget=forms.HiddenInput())

这里没有回答手头的问题(已经回答得很好了),但可能会对其他人有所帮助。

票数 15
EN

Stack Overflow用户

发布于 2018-12-17 21:46:38

首先在表单中添加字段

代码语言:javascript
复制
class CreateForm(forms.ModelForm):

extra_field     = forms.CharField(label = 'extra_field', required = False)

现在,在清理数据时,您需要从self.data 而不是 self.cleaned_data检索额外的字段

正确的

代码语言:javascript
复制
 self.data.get('extra_field')

错误的

代码语言:javascript
复制
 self.cleaned_data.get('extra_field')
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2229039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档