2012-01-16 47 views
0

我想用“实例”参数初始化一个对象,但它没有进入窗体。这是必需的,所以is_valid失败。有人可以请指教,我几乎肯定这是一个容易的错误,但无法发现它。ModelForm“实例”参数和外键字段

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(): 

最后一行证实为假。

任何帮助,欢迎。

感谢, 伊戈尔

+1

如果你把'BusinessEditForm'类(它是否继承自ModelForm?)会有所帮助。 – 2012-01-16 08:45:10

+0

感谢,原始消息中更新,但基本上答案是肯定的) – 2012-01-16 09:08:35

回答

0

如果你需要传递instance的形式,如果它是表单数据的一部分,也许你可以尝试这样的事:

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

使用\t \t form_data = request.POST.copy() \t \t如果 “类别” 不form_data与否(form_data [ “类别”]): \t \t \t form_data [“类别”] = category.id 和它的作品 - 感谢您的:)不过我认为正确的方法是“实例”来完成其工作.. – 2012-01-16 09:26:18

0

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

+0

这是明确的,但我假设'实例'应该这样做 – 2012-01-16 23:38:28

+0

只有当你返回的实例实际上设置了这些字段时才会这样做。我假设它没有,否则这不会返回一个错误。 – jknupp 2012-01-17 14:59:53

0

而不会干扰你的观点,你可以写到您的形式清洁方法:

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

但你那么也应该要求在表单中__init__方法,该实例给出,并具有设置您的排除领域。

相关问题