ModelForm的“实例”参数和外键字段
我正在尝试用一个“实例”参数来初始化一个对象,但它没有进入表单。这个参数是必填的,所以验证失败了。有人能给点建议吗?我几乎可以肯定这是个简单的错误,但我就是找不到。
表单:
from django.forms import ModelForm
from tagging.forms import TagField
class BusinessEditForm(ModelForm):
tags = TagField()
class Meta:
model = Business
exclude = ('owner', 'pub_date')
views.py中的逻辑
if businessid:
b = Business.objects.get(id=businessid)
category = b.category
assert(b.owner == request.user) or request.user.is_staff
#form = forms.BusinessEditForm(request.POST, instance=b)
else:
assert category.is_public or request.user.is_staff
b = Business(owner=request.user, category_id=category.id)
# form = forms.BusinessEditForm(request.POST, instance=b)
isNew = True
if request.method == "POST":
form = forms.BusinessEditForm(request.POST, instance=b)
if form.is_valid():
最后这一行验证结果是False。
任何帮助都很欢迎。
谢谢,
Igor
3 个回答
0
为了让你的视图更简洁,你可以在表单的清理方法里写一些代码:
def clean(self):
self.cleaned_data.update(excluded_field=self.instance.excluded_field)
return super(YourForm, self).clean()
不过,你还需要在表单的初始化方法里,确保传入的实例是有效的,并且排除的字段已经设置好。
0
如果你需要把 instance
作为表单数据的一部分传递给表单,你可以试试下面这样的做法:
if request.method == "POST":
form_data = request.POST.copy()
form_data['instance'] = b
form = forms.BusinessEditForm(form_data)
0
如果你在表单中排除了必填字段,那么在调用 is_valid()
之前,你需要通过代码来设置这些字段。否则,表单就无法创建一个有效的 Business
对象。这就是为什么 is_valid()
会返回 False
的原因。