Django ModelForm 额外字段不在模型中
我创建了一个模型表单,添加了一些在模型中没有的额外字段。我用这些字段在保存表单时进行一些计算。
这些额外字段会出现在表单上,并且在提交表单时会通过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 属性中遇到了一个“只能将元组(而不是列表)连接到元组”的错误。把它改成元组后就好了。