Django ModelForm 额外字段不在模型中

73 投票
8 回答
58889 浏览
提问于 2025-04-15 19:04

我创建了一个模型表单,添加了一些在模型中没有的额外字段。我用这些字段在保存表单时进行一些计算。

这些额外字段会出现在表单上,并且在提交表单时会通过POST请求发送。但是,问题是当我验证表单时,这些字段并没有被加入到cleaned_data字典中。我该如何访问它们呢?

8 个回答

8

首先在表单中添加这个字段

class CreateForm(forms.ModelForm):

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

现在在清理你的数据时,你需要从 self.data 中获取额外的字段,而不是从 self.cleaned_data 中获取

正确的做法:

 self.data.get('extra_field')

错误的做法:

 self.cleaned_data.get('extra_field')
18

我遇到了一个非常相似的问题,虽然我觉得自己做了所有必要的步骤,但在启动Django时却出现了这个错误:

django.core.exceptions.FieldError: Unknown field(s) (my_new_field) specified for MyModel

这真是我一个小失误,我不小心用Widget类来声明了我的字段:

class MyForm(forms.ModelForm):
    my_new_field = forms.HiddenInput()

而不是用Field类:

class MyForm(forms.ModelForm):
    my_new_field = forms.CharField(widget=forms.HiddenInput())

这里我不打算回答具体的问题(那个问题已经有很好的答案了),但这可能对其他人有帮助。

52

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

在 Django 2 及以上版本中,你可以这样添加额外的字段:

class ProfileForm(forms.ModelForm):
    
    extra_field = forms.ImageField()

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

原始回答(Django 1)

你可以在 Django 的 ModelForm 中添加额外的字段。想象一下,你有一个自定义的用户模型和这个 ModelForm

class ProfileForm(forms.ModelForm):

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

现在,假设你想要添加一个额外的字段(在你的用户模型中没有,比如一个图片头像)。你可以这样扩展你的表单:

from django import forms

class AvatarProfileForm(ProfileForm):

    profile_avatar = forms.ImageField()

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

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

# (view.py)

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

希望这对你有帮助。祝你好运!

编辑:

我在 AvatarProfileForm.Meta.fields 属性中遇到了一个“只能将元组(而不是列表)连接到元组”的错误。把它改成元组后就好了。

撰写回答