zmodyfikuj wartość paginate_by dla wszystkich stron

Nov 23 2020

Mam dodatkowe pytanie dotyczące odpowiedzi na pytanie Zmień wartość dla paginate_by w locie

Dodałem w 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>

i ta funkcja w mojej ListViewklasie

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)

działa świetnie, a paginate_bydo adresu URL jest dodawany. Mój problem polega na tym, że kiedy klikam drugą stronę, wraca do 5.

To jest mój HTML paginacji

{% 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 %}

Jaki jest język Pythona w utrzymywaniu parametru paginate_by (jeśli istnieje) w adresie URL podczas zapętlania stron?

Odpowiedzi

AmanGarg Nov 26 2020 at 00:42

Za pomocą {{ request.GET.paginate_by }}można uzyskać dostęp do paginate_byparametrów zapytania w szablonie.

Tak więc Twój kod HTML paginacji będzie wyglądał następująco:

{% 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 %}

firstofis ustawi wartość paginate_byna parametr zapytania lub 5, który będzie wartością domyślną.

ResleyRodrigues Dec 01 2020 at 14:00

Możesz utworzyć tag szablonu, który będzie obsługiwał parametry zapytania za Ciebie.

Oto dwa proste tagi

@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))

Twój HTML będzie wyglądał

{% 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 %}

Z tym, co już było w zapytaniu, parametry nadal tam będą, tylko strona zostanie zmieniona. Więc to działa, jeśli zdecydujesz się dodać więcej parametrów, takich jak filtrowanie.

AjayLingayat Nov 25 2020 at 05:57

Możesz spróbować tego w swoim szablonie 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>

Przekaż paginate_byobiekt do html i dodaj go do linków paginacyjnych. zobacz poniższy kod:

{% 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 %}