【问题标题】:modify the value of paginate_by for all pages修改所有页面的 paginate_by 的值
【发布时间】:2020-12-02 02:39:23
【问题描述】:

我对@9​​87654321@的回答有一个后续问题

我在 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(如果存在)参数的 Pythonic 是什么?

【问题讨论】:

    标签: python django


    【解决方案1】:

    使用{{ 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,这将是默认值。

    【讨论】:

    • 我必须在我的get_queryset 中添加self.paginate_by = self.request.GET.get("paginate_by"),但这正是我想要的!谢谢
    • 您应该对self.paginate_by = self.request.GET.get("paginate_by") 使用get_paginate_by 方法。这是获取分页大小的标准方法。
    • 我试过 def get_paginate_by(self, queryset): return self.request.GET.get("paginate_by") 没用
    • @goku 如果这个答案对你有帮助,请采纳,以便其他人看到这是正确的答案。
    • @M-Chen-3 我做了
    【解决方案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 %}
    

    有了这个,查询参数中已经存在的任何东西都将继续存在,只有页面会被更改。因此,如果您决定添加更多参数(例如过滤),则此方法有效。

    【讨论】:

      【解决方案3】:

      你可以在你的 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 %}
      

      【讨论】:

      猜你喜欢
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多