【问题标题】:Search part in navbar doesn't work properly (django)导航栏中的搜索部分无法正常工作(django)
【发布时间】:2022-01-09 09:14:40
【问题描述】:

我想在导航栏中创建一个搜索框并显示我搜索的食物,但它似乎无法正常工作。我找不到问题出在哪里;我的意思是,如果我搜索一种存在的食物,它什么都不会显示。

我的views.py 文件:

class SearchResultsView(ListView):
    model = Food
    template_name = "restaurant/food_search_results.html"
    context_object_name = "data"

    def get_queryset(self):
        query = self.request.POST.get("search")
        if query is not None:
            return Food.objects.filter(name__icontains=query)
        else:
            return

我的 urls.py 文件:

path("search", SearchResultsView.as_view(), name='search_results'),

我的 base.html 文件:

<form class="form-inline my-2 my-lg-0" action="/search" method="get">
          {% csrf_token %}
          <div class="input-group">
              <label>
                  <input name="search" type="text" class="form-control" placeholder="Search Foods ...">
              </label>
              <div class="input-group-append">
                <a class="btn btn-outline-warning" href="{% url 'search_results' %}" type="submit" >Search</a>
              </div>
          </div>
        </form>

【问题讨论】:

  • 什么不起作用?
  • @WillemVanOnsem 我的意思是,如果我搜索一种存在的食物,它什么也不会显示,当我打印查询时它会打印 None。

标签: django search django-queryset


【解决方案1】:

您使用&lt;button type="submit"&gt;&lt;/button&gt; 提交表单,因此您应该将表单更改为:

<form class="form-inline my-2 my-lg-0" action="{% url 'search_results' %}" method="get">
  {% csrf_token %}
  <div class="input-group">
      <label>
          <input name="search" type="text" class="form-control" placeholder="Search Foods ...">
      </label>
      <div class="input-group-append">
        <button type="submit" class="btn btn-outline-warning">Search</button>
      </div>
  </div>
</form>

然后在视图中搜索:

class SearchResultsView(ListView):
    model = Food
    template_name = 'restaurant/food_search_results.html'
    context_object_name = 'data'

    def get_queryset(self):
        query = self.request.GET.get('search')  # ? use GET
        if query is not None:
            return Food.objects.filter(name__icontains=query)
        else:
            return Food.objects.none()  # ? otherwise still return a queryset

【讨论】:

  • 非常感谢,你拯救了我的一天 :)
【解决方案2】:

您搜索未返回任何查询集的原因是您发布查询,而不是获取查询集。这实际上是您错过了 query = self.request.POST.get("search"), Instend of query = self.request.GET.get("search")


class SearchResultsView(ListView):
    model = Food
    template_name = "restaurant/food_search_results.html"
    context_object_name = "data"

    def get_queryset(self):
        query = self.request.GET.get("search")
        if query is not None:
            return Food.objects.filter(name__icontains=query)
        else:
            return Food.objects.none()

【讨论】:

  • 我已将其更改为 GET,但是当我打印查询时,它会打印 None。
  • 您是否在搜索框中进行了查询,并且您确定您的后端保存了食物数据?
  • 您可能还需要查看您的搜索表单!
猜你喜欢
  • 2016-06-26
  • 2016-08-16
  • 2020-03-31
  • 2016-08-15
  • 2018-01-05
  • 2020-10-06
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
相关资源
最近更新 更多