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

0 投票
3 回答
1152 浏览
提问于 2025-04-17 10:21

我正在尝试用一个“实例”参数来初始化一个对象,但它没有进入表单。这个参数是必填的,所以验证失败了。有人能给点建议吗?我几乎可以肯定这是个简单的错误,但我就是找不到。

表单:

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 的原因。

撰写回答