2010-01-19 31 views
1

我已經定製了我的一個表單,現在它沒有通過is_valid()測試。沒有form.errors可見。任何想法,我去哪裏錯了?擴展表單靜默失敗

形式:

class SearchForm(forms.Form): 
    param = forms.CharField(required=False, max_length = 500, label = 'Search for') 
    sets = forms.ModelMultipleChoiceField(queryset=Set.objects.all())  
    onlyDiffer = forms.BooleanField(required=False, label = 'Display varying only') 

    def __init__(self, userN = False, *args, **kwargs): 
     super(SearchForm,self).__init__(*args,**kwargs) 
     self.userN = userN 
     self.fields['sets'].queryset=Set.objects.filter(Q(owner = None) | Q(owner=self.userN)) 

查看:

def search(request): 
    template = 'search.html' 
    if request.method == 'POST': 
     form = SearchForm(request.POST) 
     if form.is_valid(): 
      (..do search..) 
     else: 
      return direct_to_template(request, template, {'form' : SearchForm(), 'errors' : form.errors}) 
    else: 
     usr = request.user 
     form = SearchForm(usr) 
     return direct_to_template(request, template, { 'form': form }) 

謝謝!

回答

3

gruzczy有正確的想法,但更好的方法來做到這一點是避免在首位改變__init__函數簽名。

def __init__(self, *args, **kwargs): 
    self.userN = kwargs.pop('userN', None) 
    super(SearchForm,self).__init__(*args,**kwargs) 
    ...etc... 
+1

是的,這的確是個好主意。我只是懶惰的,只是說,錯誤在哪裏,而不是如何正確:-P – gruszczy 2010-01-19 17:20:09

2

這可能是因爲你將request.POST傳遞給了userN參數。如果你先有關鍵字參數,那並不意味着,那個request.POST會自動放入參數中 - 相反,它會放到userN上。試試這個:

form = SearchForm(False, request.POST)