2012-08-23 85 views
0

可能重複:
Validating a form with overloaded initDjango的動態的ModelForm不會驗證

我花了整個下午試圖找出我做錯了什麼在這裏,我知道這將是一些面子愚蠢的事情。當用戶填寫表格時,位置選擇框取決於用戶的國家並相應地列出不同的城市。

型號&的ModelForm

class Cars(models.Model): 
    owner = models.ForeignKey(User) 
    name = models.CharField(max_length=25) 
    location = models.PositiveIntegerField(default=1) 
    created = models.DateTimeField(default=utc_time) 

class CarsForm(ModelForm): 
    def __init__(self, country, *args, **kwargs): 
     super(CarsForm, self).__init__(*args, **kwargs) 
     self.fields['location'] = forms.ModelChoiceField(queryset=Cities.objects.filter(country=country)) 

    class Meta: 
     model = Cars 
     exclude = ('owner', 'created',) 

查看

def new_car(request): 
    if request.method == u'POST' and request.is_ajax(): 
     form = CarsForm(request.POST) 
     if form.is_valid(): 
         etc... 

在從計算器的建議,我編輯的ModelForm 初始化,使該國的變量傳遞。表單創建和html顯示正常,一切都很好,只是現在表單不會驗證。

UPDATE: 好了,它看起來像我(意爲 '你')得到它的工作。有幾件事情是醜陋的,一旦固定它的工作原理確定:

  • 位置字段類型變更爲外鍵,修正 數據不匹配的問題
  • 初始化修改爲接受國爲kwarg
  • 的表單驗證現在將變量作爲kwarg傳遞給變量 CarsForm(request.POST,country = country)

SUCCESS!不到一個小時。非常感謝大家!

+0

是的,這是相同的基本問題。 –

+0

如果我錯了,糾正我,但'ModelChoiceField'在它的'to_python()'方法中設置它的值來自queryset。這與「位置」模型中定義的字段類型不是直接矛盾嗎?'location'不是外鍵,它是'PositiveIntegerField',這似乎是爲什麼會有驗證錯誤。 – Brandon

+0

@Brandon這是一個次要問題。沒有數據綁定到表單,所以'is_valid'提前保留而不運行任何實際驗證。 –

回答

1

要麼這是解決方案,或者您的複製和粘貼有問題;)

你已經正確定義過纏身__init__方法,但你沒有真正傳遞country參數;這樣做會是這樣的:

form = CarsForm(country, request.POST) 

這意味着request.POST總是被存儲在country,從不傳遞給父類的方法__init__

如果形式得​​不到數據,is_valid()總是返回False

旁註:SkillForm從哪裏來?應該是CarsForm

+0

編輯擰緊--SkillForm應該是CarsForm!我會解決它以避免不必要的混淆。 – slumber

1

你的變化使得country的第一個參數,但你傳遞POST數據作爲第一個參數。 form = CarsForm(request.POST)