python - 将当前过滤器选择提供给 Django 中的另一个自定义 SimpleListFilter

标签 python django django-admin django-admin-filters

我正在尝试使一个过滤器的提示发生变化,以响应在另一个过滤器中所做的当前选择。对于如何将 AttributeCategoryFilter 的当前选定值传递给 AttributeFilter,我感到非常迷茫。我正在使用 Django 1.4-dev。试图弄清楚我是否应该为此目的使用 RelatedFieldListFilter。看起来这些功能还很年轻,还没有 (m) 任何在野外流传的例子。

    class AttributeCategoryFilter(SimpleListFilter):
        title = _('Attribute Category')
        parameter_name = 'attribute_category'
        def lookups(self, request, model_admin):
            attributes = Attribute.objects.filter(parent_attribute=None)
            prompts = []
            for attribute in attributes:
                prompts.append((attribute.title, _(str(attribute.title))))
            return prompts
        def queryset(self, request, queryset):
            if self.value():
                return queryset.filter(attribute__category=self.value())
            else:
                return queryset


    class AttributeFilter(SimpleListFilter):
        title = _('Attribute Title')
        parameter_name = 'attribute_title'
        def lookups(self, request, model_admin):
            desired_category =  # Needs to be a reference to the selected value in the AttributeCategoryFilter above
            attributes = Attribute.objects.filter(category=desired_category).exclude(parent_attribute=None)
            prompts = []
            for attribute in attributes:
                prompts.append((attribute.title, _(str(attribute.title))))
            return prompts
        def queryset(self, request, queryset):
            if self.value():
                return queryset.filter(attribute__title=self.value())
            else:
                return queryset


    class ValueAdmin(admin.ModelAdmin):
        list_display = ('package', 'attribute', 'presence', 'text', 'modified', 'created')
        list_filter = ('package', AttributeCategoryFilter, AttributeFilter, 'presence', 
            'attribute__admin_approved', 'attribute__dtype', 'modified')
        search_fields = ('package', 'attribute', 'text')
        list_display_links = ('package', )
        list_editable = ('presence', 'text')
        list_per_page = 20000
    admin.site.register(Value, ValueAdmin)   

最佳答案

这对我有用...“TypeListFilter”仅在使用“Category”过滤器后可见,然后显示属于所选类别“subTypeOf”的所有条目。进一步向下的“特殊情况”黑客确保过滤器在用户选择另一个类别时消失。 “_class”参数增加了一些额外的灵 active 。我对不同但相关的 Type 类使用相同的过滤器,只需要覆盖这个参数。只需将其替换为您要过滤的 admin.Model 类即可。

class TypeListFilter( admin.SimpleListFilter):
    """
    Provide filter for DnaComponentType (the actual "second level" type).

    This filter has one cosmetic problem, which is that it's setting is not
    automatically deleted if the category filter is changed. I tried but the
    request and queryset are all immutable. Instead, the queryset method is 
    checking for any missmatch between category and filter name and filtering
    is ignored if the category name doesn't match the current subType name.
    """
    title = 'Type'
    parameter_name = 'type'

    _class = None

    def lookups(self, request, model_admin):
        """
        Returns a list of tuples. The first element in each
        tuple is the coded value for the option that will
        appear in the URL query. The second element is the
        human-readable name for the option that will appear
        in the right sidebar.
        """
        if not u'category' in request.GET:
            return ()

        category_name = request.GET[u'category']
        types = self._class.objects.filter(subTypeOf__name=category_name)
        return ( (t.name, t.name) for t in types )

    def queryset(self, request, queryset):
        """
        Returns the filtered queryset based on the value
        provided in the query string and retrievable via
        `self.value()`.
        """
        if not u'category' in request.GET:
            return queryset

        category = request.GET[u'category']
        subtypes = self._class.objects.filter(subTypeOf__name=category)

        r = queryset.filter(componentType__subTypeOf__name=category)

        if not self.value():
            return r

        ## special case: missmatch between subtype and category
        ## which happens after switching the category
        if len(subtypes.filter(name=self.value())) == 0:
            return r

        return r.filter(componentType__name=self.value())

关于python - 将当前过滤器选择提供给 Django 中的另一个自定义 SimpleListFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9707002/

相关文章:

Django CMS 自定义插件 - 如何处理翻译

python - "admin"子目录触发(无意中)Django 管理页面

Django 管理员 : pass variable by URL

python - 在管理中预填充 django 水平过滤器

python - 统计机器翻译的短语提取算法

python - Pandas :过滤值出现在对的两端,但不在组内

django - 如何使 TimeField 时区感知?

python - 我应该使用高级 GeoDjango 库进行一项简单的计算吗?

python - Flask-SQLAlchemy 左外连接过滤查询

django - 无法将 get_FOO_display 与表单一起使用