【问题标题】:ModelForm "instance" parameter and foreign key fieldModelForm“实例”参数和外键字段
【发布时间】:2012-01-16 08:40:03
【问题描述】:

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

欢迎任何帮助。

谢谢, 伊戈尔

【问题讨论】:

  • 如果你把BusinessEditForm类放在会有所帮助(它是否继承自ModelForm?)。
  • 谢谢,在原消息中更新了,但基本上答案是肯定的)

标签: python django modelform


【解决方案1】:

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

if request.method == "POST":
    form_data = request.POST.copy()
    form_data['instance'] = b
    form = forms.BusinessEditForm(form_data)

【讨论】:

  • used form_data = request.POST.copy() if "category" not in form_data or not(form_data["category"]): form_data["category"] = category.id 它有效 -谢谢你:)但我认为正确的方法是让“实例”完成它的工作..
【解决方案2】:

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

【讨论】:

  • 这很清楚,但我假设“实例”应该这样做
  • 只有在您返回的实例实际上设置了这些字段时才会这样做。我假设它没有,否则这不会返回错误。
【解决方案3】:

在不弄乱您的视图的情况下,您可以在表单中编写 clean 方法:

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

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

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2014-09-02
    • 2011-08-08
    相关资源
    最近更新 更多