すべてのページの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に追加されます。私の問題は、2番目のページをクリックすると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(存在する場合)パラメーターを保持するというpythonicとは何ですか?

回答

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

firstofisは、の値をpaginate_byクエリパラメータまたは5に設定します。これがデフォルト値になります。

ResleyRodrigues Dec 01 2020 at 14:00

クエリパラメータを処理するテンプレートタグを作成できます。

ここに2つの簡単なタグがあります

@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_byオブジェクトをhtmlに渡し、ページネーションリンクに追加します。以下のコードを参照してください。

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