2012-01-16 76 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__方法,該實例給出,並具有設置您的排除領域。