gpt4 book ai didi

django - 分页过滤器

转载 作者:行者123 更新时间:2023-12-04 11:56:32 25 4
gpt4 key购买 nike

我有一个带有汽车品牌和型号相关下拉列表的过滤器。因为我不想在一页上显示所有这些,所以我添加了一个分页器。问题是过滤器工作正常,但它没有在页面中延续
当过滤器处于事件状态时,网址看起来像/cars/?manufacture=2&model=2如果我转到下一页,我得到的只有 /cars/?page=2我想要类似 /cars/?manufacture=2&model=2?page=2 的东西
如果我打印 {{ posts|length }}它确实返回了被过滤的正确数量的项目,所以那里没有问题
我相信问题在于模板中的下一个和上一个按钮,因为它们除了下一页之外没有在其中传递任何参数。我如何将过滤器装入分页器。
看法

def allCarsView(request):

model = Post

myFilter = carFilter(request.GET, queryset=Post.objects.all())
posts = myFilter.qs

page = request.GET.get('page', 1)
paginator = Paginator(posts.order_by('date_posted'), 2)
page_obj = paginator.get_page(page)
page_range = paginator.get_elided_page_range(number=page)

context = {
'posts':posts, 'myFilter':myFilter, 'page_range': page_range,
'page': page, 'paginator': paginator, 'page_obj': page_obj
}
return render(request, 'blog/cars.html', context)
分页器 html
<nav aria-label="Page navigation example " class="paginator">
<nav aria-label="Page navigation example " class="paginator">
<ul class="pagination justify-content-center">
<li class="page-item">
{% if page_obj.has_previous %}
<a class="page-link" href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
{% else %}
</li>

<li class="page-item disabled">
<a class="page-link" href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
{% endif %} {% for i in page_obj.paginator.page_range %} {% if page_obj.number == i %}
<li class="page-item active" aria-current="page">
<a class="page-link" href="#">{{ i }}</a>
</li>
{% elif i > page_obj.number|add:'-3' and i < page_obj.number|add:'3' %}
<li class="page-item"><a class="page-link" href="?page={{ i }}">{{ i }}</a></li>
{% endif %} {% endfor %}

<li class="page-item">
{% if page_obj.has_next %}
<a class="page-link" href="?page={{ page_obj.next_page_number }}" aria-label="Previous">
<span aria-hidden="true">&raquo;</span>
</a>
{% else %}
</li>

<li class="page-item disabled">
<a class="page-link" href="#" aria-label="Previous">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
{% endif %}
</ul>
</nav>

更新:
从做更多的研究来看,我的问题似乎与分页器中的 url 有关,因为它们不带有任何参数。似乎没有最好的方法来做到这一点,我尝试过的解决方案一无所获。
更新:
尝试使用此 post as the solution
View (在之前的代码下添加)
从 Django 导入模板
register = template.Library()
@register.simple_tag
def url_replace(request, field, value):

dict_ = request.GET.copy()

dict_[field] = value

return dict_.urlencode()
模板:
<a class="page-link" href="?{% url_replace request 'page' page_obj.next_page_number %}" aria-label="Previous">
然后我得到错误
Invalid block tag on line 88: 'url_replace', expected 'elif', 'else' or 'endif'. Did you forget to register or load this tag?
所以在顶部,如果我添加
{% load url_replace %}
抛出错误 'url_replace' is not a registered tag library尝试能够从分页器中选择页码
            {% elif i > page_obj.number|add:'-3' and i < page_obj.number|add:'3' %}
{% if page_obj.number > i %}
<li class="page-item"><a class="page-link" href="?{% querystring_replace request 'page' page_obj.previous_page_number %}">{{ i }}</a></li>
{% endif %}
{% if page_obj.number < i %}
<li class="page-item"><a class="page-link" href="?{% querystring_replace request 'page' page_obj.next_page_number %}">{{ i }}</a></li>
{% endif %}
{% endif %} {% endfor %}

最佳答案

这可以使用自定义模板标签来完成,如 this answer 所示。 .但是,该答案跳过了创建自定义标签的整个过程,所以让我向您展示如何做到这一点。
Django 要求您的自定义标签保存在名为 templatetags 的文件夹中。在应用程序内。因此,您的应用程序的文件夹结构必须如下所示:

my-app/
├─ __ini__.py
├─ models.py
├─ views.py
├─ templatetags/
│ ├─ __init__.py
│ ├─ myapp_tags.py
提示:您还可以创建一个专门用于保留自定义标签的新应用程序。这样就可以很容易地在不同的项目中重用它们。确保您的新应用位于 INSTALLED_APPS列表。
现在打开 myapp_tags.py文件并在那里创建自定义标签:
# myapp_tags.py

from django import template

register = template.Library()

@register.simple_tag
def querystring_replace(request, key, value):
"""Replace the given `key` with the given `value`
in the request's querystring. The rest of the
querystring remains unchanged.
"""
query_dict = request.GET.copy()
query_dict[key] = value
return query_dict.urlencode()
要在模板中使用此标签,您需要 加载包含标签的文件 :
 <!-- load the file containing the tags -->
{% load myapp_tags %}

<!-- now you can use all the tags from myapp_tags -->
{% querystring_replace request 'page' page_obj.next_page_number %}

关于django - 分页过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68820700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com