django 如何在默认情况下不显示项目列表?

nmpmafwu  于 2023-02-17  发布在  Go
关注(0)|答案(2)|浏览(168)

有一个显示要素列表的页面。在此页面上还有一个按值搜索的页面。当我输入一个值时,此页面仅显示具有该值的要素。
我需要让页面默认只显示搜索结果。而且只有在查询之后,页面才会显示输入值的元素。怎么做?
home.html

<div class="headtext">
    <form method="GET" action="{% url 'search' %}">
        <input type="search" type="text" name="q" prequired placeholder="Put appnumber">
        <button type="submit">Find</button>
    </form>
</div>
<div>
  {% for application in object_list %}
        <div>
            <p>Application: {{ application.appnumber }}, status: {{ application.status }}</p>
        </div>
  {% endfor %}
</div>

urls.py

from django.urls import path
from .views import HomeView, Search

urlpatterns = [
    path('', HomeView.as_view(), name="home"),
    path('search/', Search.as_view(), name="search"),

views.py

class HomeView(ListView):
    model = Application
    template_name = 'home.html'

class Search(ListView):
    template_name = 'home.html'
    def get_queryset(self):
        return Application.objects.filter(appnumber__icontains=self.request.GET.get("q"))
    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context["q"] = self.request.GET.get("q")
        return context
6kkfgxo0

6kkfgxo01#

只需检查object_list上下文变量是否存在:

<div class="headtext">
    <form method="GET" action="{% url 'search' %}">
        <input type="search" type="text" name="q" prequired placeholder="Put appnumber">
        <button type="submit">Find</button>
    </form>
</div>

{% if object_list %}
<div>
  {% for application in object_list %}
        <div>
            <p>Application: {{ application.appnumber }}, status: {{ application.status }}</p>
        </div>
  {% endfor %}
</div>
{% endif %}

编辑:我没有注意到HomeView也是ListView的子类,修改为:

class HomeView(TemplateView):
    template_name = 'home.html'
ncecgwcz

ncecgwcz2#

你可以有一个从request中获取'q'并返回它或None的方法,然后你的get_queryset可以使用这个参数返回你需要的对象列表。
像这样的东西应该管用

class Search(ListView):
    template_name = 'home.html'

    def get_q(self):
        q = self.request.GET.get('q', None)
        return q

    def get_queryset(self):
        q = self.get_q()
        if not q:
            return []
        return Application.objects.filter(appnumber__icontains=q)

相关问题