使用Djangofilter库和CBV进行分页

2024-06-16 11:45:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道之前有人问过一个相关的问题: how can I use pagination with django_filter但我确实尝试过让它与我的类一起工作,但是因为我使用了一个自定义的LinkWidget或类,我发现很难将分页包含到我的ResultsFilter类中,甚至很难让它与视图和模板一起工作

以下是我目前的代码:

过滤器.py

# I didn't do much just changed so filters would be displayed as text/url just like django admin works instead of FORMS
# and i also add style to the returned <li>

class MyLinkWidget(widgets.LinkWidget):
    """docstring for ClassName"""
    def __init__(self, **karg):
        # super().__init__()
        super(widgets.LinkWidget, self).__init__(**karg)
    def option_string(self):
        return '<li class="list-group-item list-group-item-dark"><a%(attrs)s href="?%(query_string)s">%(label)s</a></li>'

class ResultsFilter(FilterSet):
    important = AllValuesFilter(widget=MyLinkWidget(attrs={"class":"list-group"}))
    viewed = AllValuesFilter(widget=MyLinkWidget(attrs={"class":"list-group"}))

    class Meta:
        model = Results
        fields = ['viewed', 'important',]

视图.py

class ResultView(ListView):
    paginate_by = 3
    model = Results
    template_name = 'results_filter.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['filter'] = ResultsFilter(self.request.GET, queryset=self.get_queryset())
        return context

最后模板文件是:

结果过滤器.html

<div class="filter_header">
  <span class="l">Filter by Viewed</span>
  {{filter.form.viewed}}
</div>

<div class="filter_header">
  <span class="l>Filter by Viewed</span>
  {{filter.form.important}}
</div>

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

编辑

所以基本上,当我在http://127.0.0.1:8000/时,它显示忽略paginate_by = 3的所有记录,我单击next url变成http://127.0.0.1:8000/?page=2,但仍然显示所有记录。这意味着分页不起作用,而是单击筛选以获取重要信息或输入url作为http://127.0.0.1:8000/results/?page=3&important=False。我注意到只显示了数据i.e (20 records),其中importanceFalse,但我只需要3页记录,这样我就可以单击“下一步”查看其他记录

底线是我认为paginate_by没有链接到queryset根据我上面的类返回的Django-Filter


Tags: selfdivobjby记录contextpagegroup