Django форма поиска с несколькими фильтрами - PullRequest
0 голосов
/ 09 апреля 2020

на моем 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>

1 Ответ

0 голосов
/ 09 апреля 2020

Вам не нужно делать все это, вам нужно только отфильтровать ваш набор запросов. Также вы должны изменить метод вашей формы на 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)). Я не знаю вашу модель, поэтому я не знаю, каковы ваши критерии для матча.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...