1

我正在尝试显示一个下拉列表,该下拉列表仅显示查询集中的一些对象,但要么我收到错误,要么我没有显示,或者我正在显示全部。

models.py
class Book(models.Model):
    name = models.CharField(max_length=200, default='')
    owner = models.CharField(max_length=200, default='') 

    def __unicode__(self):
        return self.name

class DropDownList(forms.Form):
    switch = forms.ModelChoiceField(queryset=Book.objects.none().order_by('name'), widget=forms.Select(attrs={"onChange":'submit()'}), required=False, initial=0)

    def __init__(self, u, *args, **kwargs):
        super(DropDownList, self).__init__(*args, **kwargs)    
        self.fields['switch'].queryset = Book.objects.filter(owner = u)


views.py
d = DropDownList('anthony')

当我尝试同步数据库时,我得到:“NameError:名称'u'未定义 我尝试使用其他方法进行过滤get(Q(owner = u)),但无济于事。我正在关注此片段http://djangosnippets.org/snippets/2481中的信息/ 当我没有过滤它包含的项目时,下拉列表正确显示。

4

2 回答 2

4

检查您的代码:

  1. 如果您覆盖该__init__方法,请不要忘记调用super(...).__init__

    class DropDownList(forms.Form):
        switch = forms.ModelChoiceField(queryset=Book.objects.none().order_by('name'), widget=forms.Select(attrs={"onChange": 'submit()'}), required=False, initial=0)
    
        def __init__(self, u, *args, **kwargs):
            super(DropDownList, self).__init__(*args, **kwargs)
            self.fields['switch'].queryset = Book.objects.filter(owner=u)
    
  2. 也许只是有问题的输入错误,但请确保您使用了max_lengtharg,而不是max_lenght

    class Book(models.Model):
        name = models.CharField(max_length=200, default='')
        owner = models.CharField(max_length=200, default='')
    
        def __unicode__(self):
            return self.name
    
于 2013-05-14T08:34:12.683 回答
1

如果在表单用于不同的视图输出时需要自定义过滤器,您也可以正常构造表单,不覆盖 init,然后更改字段查询集:

def my_view_function():
   switch_query ... view specific filters ...
   form = DropDownList()
   form.fields['switch'].queryset = switch_query 
   ... rest of view render ...

或者,您也可以更改构造函数以传递这些元素的查询集。

于 2014-08-21T13:49:43.557 回答