我正在使用django-filter来显示一个下拉列表(使用ModelChoiceFilter)。当用户选择某个选项(存储在会话中;未在下面的代码中显示)时,我想要动态地重新加载下拉内容。不幸的是,我没有运气实现这一目标。我似乎无法解决定义下拉列表的类(而不是实例)变量。这是我到目前为止(AnotherModel包含与MyModel的ForeignKey关系)
(filter.py)
import django_filters
class MyFilter(django_filters.FilterSet)
drop_down = ModelChoiceFilter(queryset = MyModel.objects.filter(filter1))
i = 3 # A non-filter class variable
def __init__(self, *args, **kwargs):
self.drop_down = ModelChoiceFilter(queryset = MyModel.objects.filter(filter2))
self.i = 5
@classmethod
def class_method(cls):
# Throws AttributeError; type object 'MyFilter' has no attribute 'drop_down'
<edit: printing drop-down throws the error; assigning to it works>
print cls.drop_down
cls.drop_down = ModelChoiceFilter(queryset = MyModel.objects.filter(filter2))
cls.i=4 # Works fine
(views.py)
from project.filters import MyFilter
def my_filter(request):
print MyFilter.i # prints 3
# Throws AttributeError; type object 'MyFilter' has no attribute 'drop_down'
print MyFilter.drop_down
f =MyFilter(request.GET,
queryset = AnotherModel.objects.filter(xyz))
print MyFilter.i # prints 3
print f.i # prints 5 (as expected)
# Renders a drop-down populated with the values from filter1, not filter2
return render(request,'template.html', {'filter' : f})
我最初希望重新分配drop_down的实例会起作用,但是因为那不是我开始查看类变量。然而,我不清楚为什么我无法访问类变量;在两种情况下,它直接通过MyFilter.drop_down和@classmethod函数解决它抛出一个AttributeError,类型对象'MyFilter'没有属性'drop_down'。如上所示,我可以访问类变量i作为已发现的。
有什么明显的东西让我失踪吗?或者是否可以推荐另一种方法,或者我应该放弃django-filter并使用标准的django过滤器并解决此处所述的问题:[http://www.ilian.io/django-forms-choicefield-with-dynamic-values/]?
[编辑] @ Alex Morozov 是的,我的目标是在运行时更改下拉列表的内容。在这种情况下,这将涉及分配给ModelChoiceFilter的新查询集。像这样的东西
__init__(self,*args,**kwargs):
self.session = kwargs.pop('session', None)
super(MyFilter,self).__init__(*args, **kwargs)
self.drop_down = ModelChoiceFilter(queryset = MyModel.my_custom_manager.my_customer_filter_that_uses_session(self.session))
我知道这个例子只是初始化了实例的drop_down副本(因而没有达到预期的效果),但希望意图明确吗?