django - Django ListView 为 get_queryset() 方法设置默认查询集
问题描述
我有一个包含帖子列表和搜索表单的页面来缩小选择范围。
为了在 ListView 中使用表单输入,我更改了 get_queryset() 方法:
from django.views import generic
def is_valid_queryparam(param):
return param != '' and param is not None
class PostsListView(generic.ListView):
model = Posts
def get_queryset(self):
qs = Posts.objects.all()
# get parameters from URL, for example
# http://localhost:8000/list/title_contains=example&username_contains=example
title_contains_query = self.request.GET.get('title_contains')
username_contains_query = self.request.GET.get('username_contains')
# filter queryset based on form inputs
if is_valid_queryparam(title_contains_query):
qs = qs.filter(title__icontains=title_contains_query)
if is_valid_queryparam(username_contains_query):
qs = qs.filter(author__username__icontains=username_contains_query)
# then return the filtered queryset
return(qs)
模板:
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="form-section">
<form method="GET" action=".">
<div class="form-row">
<div class="form-group col-6">
{{ form.title|as_crispy_field }}
</div>
<div class="form-group col-6">
{{ form.username|as_crispy_field }}
</div>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
{% for post in object_list %}
<div>
<h1>{{ post.title }}</h1>
<h3>{{ post.author }}</h3>
<p> {{ post.content }}</p>
</div>
{% endfor %}
{% endblock content %}
搜索表单运行良好,但问题是现在当我第一次打开包含帖子列表的页面时,我的列表视图没有列出任何内容,直到我填写搜索表单并单击提交。
在填写搜索表单以搜索特定帖子之前,我想默认显示页面上的所有帖子。
做这个的最好方式是什么?
更新:添加了如何使用 URL 参数处理查询集的示例
解决方案
推荐阅读
- twilio - botkit-Twilio-sms 不等待回复
- java - 是什么导致 java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z
- c# - 如何获取 ASP.NET MVC 单选按钮以响应不区分大小写的路由或来自控制器的指示?
- user-interface - 当鼠标在某个x/y坐标内时如何输出字符串
- apache - Apache 错误 - 但以一种奇怪的方式:mydomain.com:80:0 服务器证书不包含与服务器名称匹配的 ID
- javascript - 在 iOS 上添加到主屏幕时,如何在 PWA 上下载动态生成的 PDF 文件?
- python - Microsoft 硬件仪表板 API:503 服务在提交产品时不可用
- javascript - JSON Stringy with Escape Characters
- git - git 推送的文件不显示在 cPanel 文件管理器中
- docker - 为什么 UDP 端口仅在 Docker 中失败?