2010-01-19 60 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)