每当我按下指向下一页的链接(这是一个get请求)时,过滤器都会被绕过,并且我会获得整个列表的相应页面(没有过滤器)。例如,如果我在第1页上找到过滤列表,然后单击“下一步”,那么我将在第2页上找到整个未过滤列表。 在models.py中,
Processing by BuildingsController#update as HTML
Parameters: {"authenticity_token"=>"p2fFVpKZnw5HroZvy3qGAbguTxf+3oEOjOrhEGTu4ImS7GpVwXrcj78XPt5ENcN6GQx9K9Cn/c3ZvMwOSqVYbQ==", "building"=>{"frequency"=>["", "3"]}, "commit"=>"Update Building", "id"=>"5"}
Building Update (0.8ms) UPDATE "buildings" SET "frequency" = $1, "updated_at" = $2 WHERE "buildings"."id" = $3 [["frequency", "---\n- ''\n- '3'\n"], ["updated_at", "2020-04-05 17:56:22.142645"], ["id", 5]]
↳ app/controllers/buildings_controller.rb:40:in `update'
(1.4ms) COMMIT
↳ app/controllers/buildings_controller.rb:40:in `update'
Redirected to http://localhost:3000/buildings/5
Completed 302 Found in 14ms (ActiveRecord: 3.7ms | Allocations: 6210)
在filters.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())
在views.py中,
import django_filters
from .models import Person
class PersonFilter(django_filters.FilterSet):
class Meta:
model = Person
fields = [
'name',
'gender',
'category',
]
在app1 / show_all_persons_page.html中,
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)
答案 0 :(得分:0)
已解决。从https://simpleisbetterthancomplex.com/snippet/2016/08/22/dealing-with-querystring-parameters.html实现的概念。为了保留当前的url参数,我们必须定义一个自定义模板标签。在app1下创建一个名为templatetags的新目录。在该目录中创建一个__init__.py
。创建另一个.py文件,例如app1_extras。在app1_extras内部,定义一个自定义模板标记,如下所示。 app1 / templatetags / app1_extras.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
这将获取我们当前的网址,并确保参数和页码都在适当的位置。 field_name是字符串“ page”,value是将从模板传递的页码。 urlencode将我们当前的URL表示为字符串。 在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 %}">« 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 »</a>
{% endif %}
</span>
</div>
{%load app1_extras%}将加载我们的新自定义模板标记。 relative_url函数现在传递给我们页面链接的href。这些参数按顺序传递,其中request.GET.urlencode将包含我们当前的URL,并将传递给urlencode参数。