python-将当前过滤器选择输入到Django中的另一个自定义SimpleListFilter
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-将当前过滤器选择输入到Django中的另一个自定义SimpleListFilter,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3669字,纯文字阅读大概需要6分钟。
内容图文
![python-将当前过滤器选择输入到Django中的另一个自定义SimpleListFilter](/upload/InfoBanner/zyjiaocheng/656/f5e678f514774aee80c278ea4be0a295.jpg)
我正在尝试更改一个过滤器的提示,以响应在另一个过滤器中进行的当前选择.对于如何获取传递给AttributeFilter的AttributeCategoryFilter的当前选定值,我感到很迷惑.我正在使用Django 1.4-dev.试图弄清楚我是否应该为此目的使用RelatedFieldListFilter.这些功能似乎还太年轻,以至于还没有任何示例在野外徘徊.
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”才可见,然后显示所选类别的“ subTypeOf”所有条目.更进一步的“特殊情况”破解可确保当用户选择另一个类别时过滤器消失.
“ _class”参数增加了一些额外的灵活性.我将相同的过滤器用于不同但相关的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全部内容,希望文章能够帮你解决python-将当前过滤器选择输入到Django中的另一个自定义SimpleListFilter所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。