如何将 OrderingFilter 添加到现有过滤器并将它们呈现为链接
How to add an OrderingFilter to existing filters and render them as links
我正在通过 django-filter 的 LinkWidget
使用 django-filter for filtering posts of a Django wagtail 索引页。这工作正常,就像在 list_filter
的 django 管理界面中一样。
现在我想通过某些条件向 sort/order 查询集公开功能。 Django-filter 确实提供了一个 OrderingFilter
(ref) - 但我不知道如何实现这个过滤器并实现类似 LinkWidget
的渲染。
我目前的做法:
# filters.py
class PostFilter(django_filters.FilterSet):
categories = PatchedAllValuesFilter(
name="categories__slug",
label="Categories",
widget=LinkWidget(),
choice_name="categories__name",
)
ordering = django_filters.OrderingFilter(
widget=LinkWidget,
fields=(
('title', 'title')
)
)
class Meta:
model = PostPage
fields = ['categories']
# views.py
from .models import PostPage
from .filters import PostFilter
filter = PostFilter(request.GET, queryset=all_posts)
filter_ordering = PostFilter(request.GET, queryset=all_posts).filters['ordering']
context = self.get_context(request)
context['filter'] = filter
context['filter_ordering'] = filter_ordering
return render(request, self.template, context, *args, **kwargs)
# template.html
<ul>
{% for choice in filter_ordering.field.choices %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
...但这不起作用。我确实从我的 OrderingFilter
那里得到了一些东西:
('', '---------')
('title', <django.utils.functional.lazy.<locals>.__proxy__ object at 0x7f0d3e021cc0>)
('-title', 'Title (descending)')
...以及如何在我的模板中将其呈现为链接?
感谢任何帮助
您只需照常呈现表单域即可。以django-filter自带的测试模型为例,
from django_filters import FilterSet, filters, widgets
from tests import models
class F(FilterSet):
o = filters.OrderingFilter(fields=['id', 'name'], widget=widgets.LinkWidget)
class Meta:
model = models.Article
fields = []
print(F().form['o'])
以上生成以下内容HTML:
<ul id="id_o">
<li><a class="selected" href="?o=">All</a></li>
<li><a href="?o=id">Id</a></li>
<li><a href="?o=-id">Id (descending)</a></li>
<li><a href="?o=name">Name</a></li>
<li><a href="?o=-name">Name (descending)</a></li>
</ul>
我正在通过 django-filter 的 LinkWidget
使用 django-filter for filtering posts of a Django wagtail 索引页。这工作正常,就像在 list_filter
的 django 管理界面中一样。
现在我想通过某些条件向 sort/order 查询集公开功能。 Django-filter 确实提供了一个 OrderingFilter
(ref) - 但我不知道如何实现这个过滤器并实现类似 LinkWidget
的渲染。
我目前的做法:
# filters.py
class PostFilter(django_filters.FilterSet):
categories = PatchedAllValuesFilter(
name="categories__slug",
label="Categories",
widget=LinkWidget(),
choice_name="categories__name",
)
ordering = django_filters.OrderingFilter(
widget=LinkWidget,
fields=(
('title', 'title')
)
)
class Meta:
model = PostPage
fields = ['categories']
# views.py
from .models import PostPage
from .filters import PostFilter
filter = PostFilter(request.GET, queryset=all_posts)
filter_ordering = PostFilter(request.GET, queryset=all_posts).filters['ordering']
context = self.get_context(request)
context['filter'] = filter
context['filter_ordering'] = filter_ordering
return render(request, self.template, context, *args, **kwargs)
# template.html
<ul>
{% for choice in filter_ordering.field.choices %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
...但这不起作用。我确实从我的 OrderingFilter
那里得到了一些东西:
('', '---------')
('title', <django.utils.functional.lazy.<locals>.__proxy__ object at 0x7f0d3e021cc0>)
('-title', 'Title (descending)')
...以及如何在我的模板中将其呈现为链接?
感谢任何帮助
您只需照常呈现表单域即可。以django-filter自带的测试模型为例,
from django_filters import FilterSet, filters, widgets
from tests import models
class F(FilterSet):
o = filters.OrderingFilter(fields=['id', 'name'], widget=widgets.LinkWidget)
class Meta:
model = models.Article
fields = []
print(F().form['o'])
以上生成以下内容HTML:
<ul id="id_o">
<li><a class="selected" href="?o=">All</a></li>
<li><a href="?o=id">Id</a></li>
<li><a href="?o=-id">Id (descending)</a></li>
<li><a href="?o=name">Name</a></li>
<li><a href="?o=-name">Name (descending)</a></li>
</ul>