【问题标题】:Django search form with multiple filter具有多个过滤器的 Django 搜索表单
【发布时间】:2020-04-10 03:32:28
【问题描述】:

在我的 Django 网站中,我有一个用户页面,其中列出了用户添加到数据库中的所有项目。有一个搜索表单供用户搜索自己的项目。问题是搜索表单不起作用。我对如何过滤数据库有点困惑,因为首先我过滤了所有项目以便只显示用户添加的项目,然后我应该根据用户输入过滤这些项目。希望有人能帮帮我,谢谢!

'def look()' 是我尝试过但不起作用的方法

Views.py

class userListView(ListView):
    model = Info
    template_name = 'search/user.html'
    paginate_by = 10

    def get_queryset(self):
        qs = super().get_queryset()
        qt = qs.filter(utente=self.request.user)
        return qt

    def look(self, request, *args, **kwargs):
        print('FORM POSTED WITH {}'.format(request.POST['cerca']))
        srch = request.POST.get('cerca')
        if srch:
            sr = Info.objects.filter(srch = Subquery(qt))
            if sr:
                return render (self.request, 'search/user.html', {'sr':sr})
            else:
                return render(self.request, 'search/user.html')
        else:
            return render(self.request, 'search/user.html')

用户模板html

<div class="add">
  <div class="posted">
    <div class="head">
      <h2> YOUR LIST </h2>

      <div class="form">
        <form method="post" action="{% url 'user' %}">
          {%csrf_token%}
          <input type="text" name="cerca" class= "form-control" placeholder="  Type Album or Band Name...">
          <!-- <button type="submit" name="submit">Search</button> -->
        </form>
      </div>

    </div>

<!-- Inserire il database dell'utente registrato -->
{% if object_list %}
{% for o in object_list %}
<div class="container_band">
  <div class=album_band>
    <!-- insert an image -->
    {%if o.cover%}
    <img src= "{{o.cover.url}}" width="100%">
    {%endif%}

  </div>

  <div class="info_band">
    <!-- insert table info -->
    <table>
      <tr><th><h3>{{o.band}}</h3></th></tr>
      <tr><td> Anno: </td><td> {{o.anno}} </td></tr>
      <tr><td> Disco: </td><td> {{o.disco}} </td></tr>
      <tr><td> Etichetta: </td><td> {{o.etichetta_d}} </td></tr>
      <tr><td> Matrice: </td><td> {{o.matrice}} </td></tr>
    </table>
  </div>

模板:

<a href="{%url 'searches'%}" >Band: {{ request.POST.srh }}</a><br/>
<a href="{%url 'searches'%}" >Album: {{ request.POST.srh }}</a>

【问题讨论】:

  • 只需实现get_queryset() 中的所有内容。您只需要返回由搜索参数过滤的相同查询集。您的方法 look 永远不会被调用,因为 Django 在运行 ListView 时不会调用方法 look

标签: python django sqlite


【解决方案1】:

你不必做所有这些,你只需要过滤你的查询集。此外,您应该将表单的方法更改为 GET,因为您没有在数据库中进行任何更改,并且 ListView 通常不会处理 POST 请求。所以在你的表单标签中更改为method="GET",然后:

def get_queryset(self):
    qs = super().get_queryset().filter(utente=self.request.user)
    q = self.request.GET.get('cerca')  # query parameter because of GET
    if q:
        qs = qs.filter(band=q)  # filter qs further
    return qs

我刚刚为band 添加了一个过滤器,但如果搜索应该在Info 模型的其他字段上,您可以进一步过滤。例如filter(Q(band=q) | Q(disco__icontains=q))。我不知道你的模型,所以我不知道你的匹配标准是什么。

【讨论】:

  • 完美,现在可以使用了!但是如果我有一个乐队和一个同名的专辑,并且在显示其中一个之前让用户决定他是在寻找乐队还是专辑呢?我制作了一个带有两个链接的模板,但我不知道在 Django 中要更改什么(我用模板编辑了问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多