【问题标题】:Extended Form silently fails扩展表单静默失败
【发布时间】:2010-01-19 16:53:21
【问题描述】:

我已经自定义了我的一个表单,现在它没有通过 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 })

谢谢!

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    gruzczy 的想法是正确的,但更好的方法是首先避免更改 __init__ 的函数签名。

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

    【讨论】:

    • 是的,这确实是更好的主意。我就是这么懒,只说错误在哪里,而不是如何改正:-P
    【解决方案2】:

    这可能是因为您将 request.POST 传递给了 userN 参数。如果您首先有关键字参数,这并不意味着 request.POST 将自动放入 args - 恰恰相反,它将被放入 userN。试试这个:

    form = SearchForm(False, request.POST)
    

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 2017-01-10
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多