如何将OrderingFilter添加到现有过滤器并将其呈现为链接

时间:2017-10-23 14:41:44

标签: django wagtail django-filter

我正在使用django-filter通过django-filter的LinkWidget过滤Django wagtail索引页面的帖子。这很好,就像在list_filter的django管理界面中一样。

现在我想公开按一些条件对查询集进行排序/排序的功能。 Django过滤器确实提供了OrderingFilterref) - 但我不知道如何实现此过滤器并实现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)')

...以及如何在我的模板中将其渲染为链接?

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

您需要像往常一样呈现表单字段。例如,使用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>