我正在尝试使用“instance”参数初始化一个对象,但它不会进入表单。这是必需的,因此is_valid失败。有人可以建议,我几乎可以肯定这是一个容易犯的错误,但无法发现它。
FORM:
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。
欢迎任何帮助。
谢谢, 伊戈尔
答案 0 :(得分:0)
如果您需要将instance
传递给表单,就像它是表单数据的一部分一样,也许您可以尝试这样的事情:
if request.method == "POST":
form_data = request.POST.copy()
form_data['instance'] = b
form = forms.BusinessEditForm(form_data)
答案 1 :(得分:0)
如果要排除表单中的必填字段,则需要在调用is_valid()
之前以编程方式设置它们,否则表单不会创建有效的Business
对象。这就是is_valid()
返回False
。
答案 2 :(得分:0)
如果不弄乱您的观点,您可以写入表单清理方法:
def clean(self):
self.cleaned_data.update(excluded_field=self.instance.excluded_field)
return super(YourForm, self).clean()
但是,您还应该在表单__init__方法中要求提供实例并设置排除字段。