动态重新加载django-filter(Model)ChoiceFilters下拉内容

时间:2016-01-26 03:20:34

标签: python django django-filter

我正在使用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副本(因而没有达到预期的效果),但希望意图明确吗?

0 个答案:

没有答案