在Django上更改ModelChoiceField的查询集

时间:2013-05-14 08:09:53

标签: python django django-forms

我正在尝试显示一个下拉列表,只显示查询集中的某些对象,但是我收到错误,或者我没有显示任何对象,或者我正在显示所有对象。

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')

当我尝试syncdb时,我得到:“NameError:名称'u'未定义 我试图使用其他方法(如get(Q(owner = u))进行过滤无效。 我正在关注此代码段中的信息http://djangosnippets.org/snippets/2481/ 当我没有过滤它包含的项目时,正确显示了下拉列表。

2 个答案:

答案 0 :(得分:3)

检查您的代码:

  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_length arg,而不是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
    

答案 1 :(得分:1)

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

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

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