我正在尝试显示一个下拉列表,只显示查询集中的某些对象,但是我收到错误,或者我没有显示任何对象,或者我正在显示所有对象。
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/
当我没有过滤它包含的项目时,正确显示了下拉列表。
答案 0 :(得分:3)
检查您的代码:
如果您覆盖__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)
也许只是有问题的错误,但请确保您使用了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 ...
或者,您也可以更改构造函数以传递这些元素的查询集。