点击分页链接后,Django搜索表单分页不保存过滤条件到URL中

问题描述 投票:0回答:1

我的搜索表单在搜索过滤某项内容后,点击分页链接后,URL中的查询字符串没有保存。换句话说,当我按照标准进行搜索时,表单正确地进行了过滤,但点击下一个分页链接后,会导致该标准消失,并重新开始分页,就像没有搜索标准一样。我想在整个分页过程中,在URL中保留该标准。我如何做到这一点?

例如,当搜索 "Test "并点击 "next "时,我希望URL字符串看起来像这样。

page=2&title__icontains=Test&visited_times__gte=&visited_times__lte=&created_at__gte=&created_at__lte=&skill_level=&subjects=。

目前的代码是这样的。

page=2

只要用户有过滤条件,page=#就需要更改,并加到URL上。

HTML。

form id='courseform' action="." method="get">
<div class="form-row">
    <div class="form-group col-12"> {{ form.title__icontains }} </div>
    <div class="form-group col-md-2 col-lg-2"> {{ form.visited_times__gte.label_tag }} {{ form.visited_times__gte }} </div>
    <div class="form-group col-md-2 col-lg-2"> {{ form.visited_times__lte.label_tag }} {{ form.visited_times__lte }} </div>
    <div class="form-group col-md-2 col-lg-2"> {{ form.created_at__gte.label_tag }} {{ form.created_at__gte }} </div>
    <div class="form-group col-md-2 col-lg-2"> {{ form.created_at__lte.label_tag }} {{ form.created_at__lte }} </div>
    <div class="form-group col-md-2"> {{ form.skill_level.label_tag }} {{ form.skill_level }} </div>
    <div class="form-group col-md-2"> {{ form.subjects.label_tag }} {{ form.subjects }} </div>
</div>

    <script src='https://www.google.com/recaptcha/api.js?render=6LeHe74UAAAAAKRm-ERR_fi2-5Vik-uaynfXzg8N'></script>
    <div class="g-recaptcha" data-sitekey="6LeHe74UAAAAAKRm-ERR_fi2-5Vik-uaynfXzg8N"></div>
    <button type="submit" class="btn btn-primary form-control">Search</button>
<p>This site is protected by reCAPTCHA and the Google
    <a target="_blank" rel="noopener noreferrer" href="https://policies.google.com/privacy">Privacy Policy</a> and
    <a target="_blank" rel="noopener noreferrer" href="https://policies.google.com/terms">Terms of Service</a> apply.
</p>


</form>

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

Views.py:

class CourseListView(ListView):
    template_name = 'courses/course_list.html'
    paginate_by = 2

    def get_queryset(self):
        return Course.objects.all()

    def get(self, request, *args, **kwargs):
        form = CourseForm(request.GET)
        queryset = self.get_queryset()
        if form.is_valid():
            queryset = queryset.filter(**{k: v for k, v in form.cleaned_data.items() if v})
        self.object_list = queryset
        return self.render_to_response(self.get_context_data(form=form,object_list=queryset,))

表单.py:

class CourseForm(forms.Form):
    title__icontains = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control col-12', 'autocomplete':'off', 'id':'title_contains', 'type':'search', 'placeholder': 'Course Name'}), required=False)
    visited_times__gte = forms.IntegerField(widget=forms.NumberInput(attrs={'class':'form-control', 'autocomplete':'off','id':'view_count_max', 'type':'number', 'min':'0', 'placeholder': '0'}), required=False, validators=[MinValueValidator(0), MaxValueValidator(99999999999999999999999999999999999)])
    visited_times__lte = forms.IntegerField(widget=forms.NumberInput(attrs={'class':'form-control', 'autocomplete':'off', 'id':'view_count_min', 'type':'number', 'min':'0', 'placeholder': '1000000'}), required=False, validators=[MinValueValidator(0), MaxValueValidator(99999999999999999999999999999999999)])
    created_at__gte = forms.DateField(widget=forms.TextInput(attrs={'class':'form-control', 'autocomplete':'off', 'id':'date_max','type':'date', 'placeholder': 'mm/dd/yyy'}), required=False)
    created_at__lte = forms.DateField(widget=forms.TextInput(attrs={'class':'form-control', 'autocomplete':'off', 'id':'date_min', 'type':'date', 'placeholder': 'mm/dd/yyy'}), required=False)
    skill_level = forms.ChoiceField(widget=forms.Select(attrs={'class':'form-control', 'autocomplete':'off','id':'skill_level'}), choices = ([('',''), ('Beginner','Beginner'), ('Intermediate','Intermediate'),('Advanced','Advanced'), ]), required=False)
    subjects = forms.ModelChoiceField(queryset=Subject.objects.all().order_by('name'), empty_label="", widget=forms.Select(attrs={'class':'form-control', 'autocomplete':'off', 'id':'subjects'}), required=False)

    # the new bit we're adding
    def __init__(self, *args, **kwargs):
        super(CourseForm, self).__init__(*args, **kwargs)
        self.fields['title__icontains'].label = "Course Name:"
        self.fields['visited_times__gte'].label = "Min Views:"
        self.fields['visited_times__lte'].label = "Max Views:"
        self.fields['created_at__gte'].label = "Min Date:"
        self.fields['created_at__lte'].label = "Max Date:"
        self.fields['skill_level'].label = "Skill Level:"
        self.fields['subjects'].label = "Subject:"
        self.fields['subjects'].queryset = Subject.objects.filter()

Models.py:

class Course(models.Model):

    SKILL_LEVEL_CHOICES = (
        ('Beginner', 'Beginner'),
        ('Intermediate', 'Intermediate'),
        ('Advanced', 'Advanced'),
    )

    slug = models.SlugField()
    title = models.CharField(max_length=120)
    description = models.TextField()
    allowed_memberships = models.ManyToManyField(Membership)
    created_at = models.DateTimeField(auto_now_add=True)
    subjects = models.ManyToManyField(Subject)
    skill_level = models.CharField(max_length=20,choices=SKILL_LEVEL_CHOICES, null=True)
    visited_times = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('courses:detail', kwargs={'slug': self.slug})

    @property
    def lessons(self):
        return self.lesson_set.all().order_by('position')

    class Meta:
        ordering = ('title',)

有办法使用这些吗?如果有,我如何用我的代码实现它?

https:/docs.djangoproject.comen3.0refrequest-response#django.http.HttpRequest.META。

querydict = self.request.GET.copy().urlencode()

python django search pagination
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.