0

我正在尝试使用“instance”参数初始化一个对象,但它没有进入表单。这是必需的,因此 is_valid 失败。有人可以建议吗,我几乎可以肯定这是一个简单的错误,但无法发现。

形式:

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。

欢迎任何帮助。

谢谢,伊戈尔

4

3 回答 3

0

如果您在表单中排除必填字段,则需要在调用之前以编程方式设置它们,否则is_valid()表单不会创建有效Business对象。这就是is_valid()回归的原因False

于 2012-01-16T16:16:18.910 回答
0

如果您需要传递instance给表单,就好像它是表单数据的一部分一样,也许您可​​以尝试这样的事情:

if request.method == "POST":
    form_data = request.POST.copy()
    form_data['instance'] = b
    form = forms.BusinessEditForm(form_data)
于 2012-01-16T08:52:26.423 回答
0

在不使您的视图混乱的情况下,您可以将其写入表单 clean 方法:

def clean(self):
  self.cleaned_data.update(excluded_field=self.instance.excluded_field)
  return super(YourForm, self).clean()

但是您还应该在您的表单中要求 __init__ 方法,给出实例并设置您的排除字段。

于 2012-02-23T15:30:54.030 回答