我如何在 Django 中创建适用于我所有视图的搜索
How Do I create a search that works in all my views in Django
我的 base.html 目前有一个搜索字段。这是一个片段
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{% url 'posts:list' %}">HEHTS</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<form method="GET" action=" " class="navbar-form navbar-right">
<div class="input-group">{% csrf_token %}
<input type="text" name="q" id="search" placeholder="search" value="{{ request.GET.q }}" class="form-control"
style="width: 350px">
<!--<input type="text" name="q" placeholder="search post" value="{{ request.GET.q }}"/>-->
<!--<input type="submit" value="Search" />-->
<!--</form>-->
<ul id="search-results">
</ul>
<span class="input-group-btn">
<button type="submit" class="btn btn-primary"><span style="font-size:1.4em" class="glyphicon glyphicon-search"></span> </button>
</span>
</div>
</form>
<ul class="nav navbar-nav">
<li><a href="{% url 'posts:list' %}">Home</a></li>
<!--<li><a href="#">Sewp</a></li>-->
{% if user.is_authenticated %}
<li><a href="{% url 'admin:index' %}">Admin</a></li>
<li><a href="{% url 'posts:create' %}">Create</a></li>
{% endif %}
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
这在我的 detail.html 视图中不起作用。它只在我的 post_list.html 视图中有效这里是他们两个的视图
def post_detail(request, slug=None):
instance = get_object_or_404(Post, slug=slug)
if instance.publish > timezone.now().date() or instance.draft:
if not request.user.is_staff or not request.user.is_superuser:
raise Http404
queryset_list = Post.objects.active()
query = request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(user__first_name__icontains=query) |
Q(user__last_name__icontains=query)
).distinct()
share_string = quote_plus(instance.content)
template = "posts/post_detail.html"
context = {
"instance": instance,
"name": instance.title,
"share_string": share_string,
"queryset_list": queryset_list
}
return render(request, template, context)
def post_list(request):
today = timezone.now().date()
queryset_list = Post.objects.active()
if request.user.is_staff or request.user.is_superuser:
queryset_list = Post.objects.all()
query = request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(user__first_name__icontains=query) |
Q(user__last_name__icontains=query)
).distinct()
paginator = Paginator(queryset_list, 8)
page_request_var = 'page'
page = request.GET.get(page_request_var)
try:
queryset = paginator.page(page)
except PageNotAnInteger:
queryset = paginator.page(1)
except EmptyPage:
queryset = paginator.page(paginator.num_pages)
template = "posts/post_list.html"
name = "user"
context = {
"object_list": queryset,
"name": name,
"page_request_var": page_request_var,
"today": today,
}
return render(request, template, context)
我想要的结果是让事情保持干燥,只需编写一次代码就可以在我的 base.html 中使用它,而且无论我呈现什么视图,它都能正常工作。
我该怎么做才能使我的博客应用程序可以在任何视图中工作?欢迎所有帮助或建议。
我认为这很容易。给搜索一个专门的视图函数和一个对应的url就可以了,比方说:
url(r'^post-search/$', views.post_search, name='post-search')
然后您将当前的搜索表单放入 base.html,并更改指向 post-search
url:
的表单操作
<form method="GET" action="{% url 'post-search' %}" class="navbar-form navbar-right">
<!-- same content goes here -->
</form>
所以现在每次你提交这个表单,它总是会去执行视图函数post_search
你做同样的过程并显示结果。
我的 base.html 目前有一个搜索字段。这是一个片段
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{% url 'posts:list' %}">HEHTS</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<form method="GET" action=" " class="navbar-form navbar-right">
<div class="input-group">{% csrf_token %}
<input type="text" name="q" id="search" placeholder="search" value="{{ request.GET.q }}" class="form-control"
style="width: 350px">
<!--<input type="text" name="q" placeholder="search post" value="{{ request.GET.q }}"/>-->
<!--<input type="submit" value="Search" />-->
<!--</form>-->
<ul id="search-results">
</ul>
<span class="input-group-btn">
<button type="submit" class="btn btn-primary"><span style="font-size:1.4em" class="glyphicon glyphicon-search"></span> </button>
</span>
</div>
</form>
<ul class="nav navbar-nav">
<li><a href="{% url 'posts:list' %}">Home</a></li>
<!--<li><a href="#">Sewp</a></li>-->
{% if user.is_authenticated %}
<li><a href="{% url 'admin:index' %}">Admin</a></li>
<li><a href="{% url 'posts:create' %}">Create</a></li>
{% endif %}
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
这在我的 detail.html 视图中不起作用。它只在我的 post_list.html 视图中有效这里是他们两个的视图
def post_detail(request, slug=None):
instance = get_object_or_404(Post, slug=slug)
if instance.publish > timezone.now().date() or instance.draft:
if not request.user.is_staff or not request.user.is_superuser:
raise Http404
queryset_list = Post.objects.active()
query = request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(user__first_name__icontains=query) |
Q(user__last_name__icontains=query)
).distinct()
share_string = quote_plus(instance.content)
template = "posts/post_detail.html"
context = {
"instance": instance,
"name": instance.title,
"share_string": share_string,
"queryset_list": queryset_list
}
return render(request, template, context)
def post_list(request):
today = timezone.now().date()
queryset_list = Post.objects.active()
if request.user.is_staff or request.user.is_superuser:
queryset_list = Post.objects.all()
query = request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(user__first_name__icontains=query) |
Q(user__last_name__icontains=query)
).distinct()
paginator = Paginator(queryset_list, 8)
page_request_var = 'page'
page = request.GET.get(page_request_var)
try:
queryset = paginator.page(page)
except PageNotAnInteger:
queryset = paginator.page(1)
except EmptyPage:
queryset = paginator.page(paginator.num_pages)
template = "posts/post_list.html"
name = "user"
context = {
"object_list": queryset,
"name": name,
"page_request_var": page_request_var,
"today": today,
}
return render(request, template, context)
我想要的结果是让事情保持干燥,只需编写一次代码就可以在我的 base.html 中使用它,而且无论我呈现什么视图,它都能正常工作。 我该怎么做才能使我的博客应用程序可以在任何视图中工作?欢迎所有帮助或建议。
我认为这很容易。给搜索一个专门的视图函数和一个对应的url就可以了,比方说:
url(r'^post-search/$', views.post_search, name='post-search')
然后您将当前的搜索表单放入 base.html,并更改指向 post-search
url:
<form method="GET" action="{% url 'post-search' %}" class="navbar-form navbar-right">
<!-- same content goes here -->
</form>
所以现在每次你提交这个表单,它总是会去执行视图函数post_search
你做同样的过程并显示结果。