ModelForm“实例”参数和外键字段

时间:2012-01-16 08:40:04

标签: python django modelform

我正在尝试使用“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。

欢迎任何帮助。

谢谢, 伊戈尔

3 个答案:

答案 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__方法中要求提供实例并设置排除字段。