모든 페이지에 대해 paginate_by 값 수정

Nov 23 2020

즉시 paginate_by 값 변경 에 대한 답변에 대한 후속 질문 이 있습니다.

HTML에 다음을 추가했습니다.

<form method="GET">
   <select name="paginate_by" id="">
        <option value="5">5</option>
        <option value="10">10</option>
        <option value="20">20</option>
        <option value="50">50</option>
   </select>
   <input type="submit" value="Paginate">
</form>

ListView수업 에서이 기능

class ReviewPostListView(ListView):
    model = Reviews
    template_name = 'reviews/reviews.html'
    context_object_name = 'rows'
    ordering = ['id']
    paginate_by = 5

    def get_paginate_by(self, queryset):
        return self.request.GET.get("paginate_by", self.paginate_by)

잘 작동 paginate_by하고 있으며 URL에 추가됩니다. 내 문제는 두 번째 페이지를 클릭하면 5로 돌아갑니다.

이것은 내 페이지 매김 HTML입니다.

{% if is_paginated %}
    {% if page_obj.has_previous %}
        <a class="btn btn-outline-info mb-4" href="?page=1">First</a>
        <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
    {% endif %}
    {% for num in page_obj.paginator.page_range %}
        {% if page_obj.number == num %}
            <a class="btn btn-info mb-4" href="?page={{ num }}">{{num}}</a>
        {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
            <a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{num}}</a>
        {% endif %}
    {% endfor %}
    {%if page_obj.has_next %}
        <a class="btn btn-outline-info mb-4" href="?page={{page_obj.next_page_number}}">Next</a>
        <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Last</a>
    {% endif %}
{% endif %}

페이지에서 루핑 할 때 URL에 paginate_by (존재하는 경우) 매개 변수를 유지하는 비단뱀은 무엇입니까?

답변

AmanGarg Nov 26 2020 at 00:42

를 사용하면 템플릿 {{ request.GET.paginate_by }}paginate_by쿼리 매개 변수에 액세스 할 수 있습니다 .

따라서 페이지 매김 HTML은 다음과 같습니다.

{% if is_paginated %}
  {% firstof request.GET.paginate_by "5" as paginate_by %}
    {% if page_obj.has_previous %}
        <a class="btn btn-outline-info mb-4" href="?page=1&paginate_by={{ paginate_by }}">First</a>
        <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
    {% endif %}
    {% for num in page_obj.paginator.page_range %}
        {% if page_obj.number == num %}
            <a class="btn btn-info mb-4" href="?page={{ num }}">{{num}}</a>
        {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
            <a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{num}}</a>
        {% endif %}
    {% endfor %}
    {%if page_obj.has_next %}
        <a class="btn btn-outline-info mb-4" href="?page={{page_obj.next_page_number}}&paginate_by={{ paginate_by }}">Next</a>
        <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}&paginate_by={{ paginate_by }}">Last</a>
    {% endif %}

{% endif %}

firstof는의 값을 기본값이 될 paginate_by쿼리 매개 변수 또는로 5설정합니다.

ResleyRodrigues Dec 01 2020 at 14:00

쿼리 매개 변수를 처리 할 템플릿 태그를 만들 수 있습니다.

다음은 두 가지 간단한 태그입니다.

@register.simple_tag(takes_context=True)
def add_get_param(context, **kwargs):
    "Used to add/replace query parameters to the current URL."
    params = context["request"].GET.dict()
    params.update(kwargs)
    return "?{}".format(urlencode(params))


@register.simple_tag(takes_context=True)
def remove_get_param(context, *args):
    "Used to remove query parameters from the current URL."
    params = context["request"].GET.dict()
    for key in args:
        params.pop(key, None)
    return "?{}".format(urlencode(params))

그리고 당신의 HTML은

{% if is_paginated %}
    {% if page_obj.has_previous %}
        <a class="btn btn-outline-info mb-4" href="?paginate_by={% add_get_param page=1 %}">First</a>
        <a class="btn btn-outline-info mb-4" href="{% add_get_param page=page_obj.previous_page_number %}">Previous</a>
    {% endif %}
    {% for num in page_obj.paginator.page_range %}
        {% if page_obj.number == num %}
            <a class="btn btn-info mb-4" href="{% add_get_param page=num %}">{{num}}</a>
        {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
            <a class="btn btn-outline-info mb-4" href="?paginate_by={{ paginate_by}}&page={{ num }}">{{num}}</a>
        {% endif %}
    {% endfor %}
    {%if page_obj.has_next %}
        <a class="btn btn-outline-info mb-4" href="{% add_get_param page=page_obj.next_page_number %}">Next</a>
        <a class="btn btn-outline-info mb-4" href="{% add_get_param page={{ page_obj.paginator.num_pages %}">Last</a>
    {% endif %}
{% endif %}

이렇게하면 쿼리 매개 변수에 이미있는 것이 무엇이든 계속 거기에있을 것이고 페이지 만 변경 될 것입니다. 따라서 필터링과 같은 매개 변수를 더 추가하기로 결정한 경우 작동합니다.

AjayLingayat Nov 25 2020 at 05:57

HTML 템플릿에서 이것을 시도 할 수 있습니다.

<select name="paginate_by" onchange="location = this.value;">
      <option value="">select</option>
      <option value="?paginate_by=5&{{page_obj.number}}">5</option>
      <option value="?paginate_by=10&{{page_obj.number}}">10</option>
      <option value="?paginate_by=20&{{page_obj.number}}">20</option>
      <option value="?paginate_by=50&{{page_obj.number}}">50</option>
</select>

패스 paginate_byHTML에 객체를하고 매김 링크에 추가합니다. 아래 코드를 참조하십시오.

{% if is_paginated %}
    {% if page_obj.has_previous %}
        <a class="btn btn-outline-info mb-4" href="?paginate_by={{ paginate_by}}&page=1">First</a>
        <a class="btn btn-outline-info mb-4" href="?paginate_by={{ paginate_by}}&page={{ page_obj.previous_page_number }}">Previous</a>
    {% endif %}
    {% for num in page_obj.paginator.page_range %}
        {% if page_obj.number == num %}
            <a class="btn btn-info mb-4" href="?paginate_by={{ paginate_by}}&page={{ num }}">{{num}}</a>
        {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
            <a class="btn btn-outline-info mb-4" href="?paginate_by={{ paginate_by}}&page={{ num }}">{{num}}</a>
        {% endif %}
    {% endfor %}
    {%if page_obj.has_next %}
        <a class="btn btn-outline-info mb-4" href="?paginate_by={{ paginate_by}}&page={{page_obj.next_page_number}}">Next</a>
        <a class="btn btn-outline-info mb-4" href="?paginate_by={{ paginate_by}}&page={{ page_obj.paginator.num_pages }}">Last</a>
    {% endif %}
{% endif %}