亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法將分頁與django過濾器一起使用?

有沒有辦法將分頁與django過濾器一起使用?

蠱毒傳說 2022-09-27 10:44:44
每當我按下指向下一頁的鏈接(這是一個 get 請求)時,都會繞過篩選器,并且我將獲得整個列表的相應頁面(沒有篩選器)。例如,如果我在第 1 頁上查看已過濾的列表,然后單擊“下一步”,則整個未篩選列表的第 2 頁登陸。在 models.py,class Person(models.Model):    name = models.CharField(max_length=50, unique=True)    gender = models.CharField(max_length=7, choices=GENDER_CHOICES)    category = models.CharField(max_length=20, choices=get_all_category_choices())在 filters.py,import django_filtersfrom .models import Personclass PersonFilter(django_filters.FilterSet):    class Meta:        model = Person        fields = [            'name',            'gender',            'category',        ]在 views.py,def show_all_persons_page(request):    context = {}    filtered_person_list = PersonFilter(        request.GET,        queryset=Person.objects.all()    )    context['filtered_person_list'] = filtered_person_list    paginated_filtered_person_list = Paginator(filtered_person_list.qs, 3)    page_number = request.GET.get('page')    person_page_obj = paginated_filtered_person_list.get_page(page_number)    context['person_page_obj'] = person_page_obj    return render(request, 'app1/show_all_persons_page.html', context)在 app1/show_all_persons_page.html,<form method="get">    {{ filtered_person_list.form.as_p }}    <button type="submit">Search</button></form>{% for person in person_page_obj %}    <img src="{{ person.picture.url }}" width="240">    <h2>        {{person.name}}        <br>        {{person.gender}}        <br>        {{person.category}}        <br>    </h2>    <br>{% endfor %}
查看完整描述

1 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

解決。從 https://simpleisbetterthancomplex.com/snippet/2016/08/22/dealing-with-querystring-parameters.html 實現的概念。為了保留當前的 url 參數,我們必須定義一個自定義模板標記。在 app1 下創建一個名為模板標記的新目錄。在該目錄中創建 一個。創建另一個.py文件,比如app1_extras。在app1_extras中,定義自定義模板標記,如下所示。app1/模板標簽/app1_extras.py,__init__.py

from django import template


register = template.Library()


@register.simple_tag

def relative_url(value, field_name, urlencode=None):

    url = '?{}={}'.format(field_name, value)

    if urlencode:

        querystring = urlencode.split('&')

        filtered_querystring = filter(lambda p: p.split('=')[0] != field_name, querystring)

        encoded_querystring = '&'.join(filtered_querystring)

        url = '{}&{}'.format(url, encoded_querystring)

    return url

這將獲取我們當前的 URL,并確保參數與頁碼一起就位。field_name是字符串“page”,值是從模板傳遞的頁碼。網址代碼將我們當前的網址表示為字符串。在 app1/show_all_persons.html,


{% load app1_extras %}


<form method="get">

    {{ filtered_person_list.form.as_p }}

    <button type="submit">Search</button>

</form>


{% for person in person_page_obj %}

    <img src="{{ person.picture.url }}" width="240">

    <h2>

        {{person.name}}

        <br>

        {{person.gender}}

        <br>

        {{person.category}}

        <br>

    </h2>

    <br>

{% endfor %}


<div class="pagination">

    <span class="step-links">

        {% if person_page_obj.has_previous %}

            <a href="{% relative_url 1 'page' request.GET.urlencode %}">&laquo; first</a>

            <a href="{% relative_url person_page_obj.previous_page_number 'page' request.GET.urlencode %}">previous</a>

        {% endif %}


        <span class="current">

            Page {{ person_page_obj.number }} of {{ person_page_obj.paginator.num_pages }}.

        </span>


        {% if person_page_obj.has_next %}

            <a href="{% relative_url person_page_obj.next_page_number 'page' request.GET.urlencode %}">next</a>

            <a href="{% relative_url person_page_obj.paginator.num_pages 'page' request.GET.urlencode %}">last &raquo;</a>

        {% endif %}

    </span>

</div>

{% 加載 app1_extras %} 將加載我們新的自定義模板標記。relative_url函數現在被傳遞給我們頁面鏈接的hrefs。參數按請求的順序傳遞。GET.網址代碼將包含我們當前的網址,并將傳遞給網址代碼參數。


查看完整回答
反對 回復 2022-09-27
  • 1 回答
  • 0 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號