使分页与django过滤器库和CBV一起工作



我知道之前有人问过一个相关的问题:我怎么能在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

最后模板文件是:

results_filter.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,然后我点击下一个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没有链接到Django-Filter返回的queryset

这有点晚了,但试试这个:

from django_filters.views import FilterView

class ResultView(FilterView):
filterset_class = ResultsFilter
paginate_by = 3

然后在html中使用object_list,它将包含分页的结果。

{% for object in object_list %}
...
{% endfor %}

最新更新