Как я могу отфильтровать экземпляры моей модели на основе их категориального атрибута, используя поле ввода опций выбора (выбор из выпадающего меню) - PullRequest
1 голос
/ 01 июня 2019

У меня есть модель Post в блоге, и один из ее атрибутов является категориальным атрибутом (store_type). Этот категориальный атрибут содержит 4 возможных значения: кафе, кофейня, десертное кафе и ресторан

Я хочу создать фильтр, чтобы я мог отображать сообщения в соответствии с типом магазина, связанного с этим сообщением, и я хочу, чтобы пользователь мог использовать раскрывающееся меню, а не осуществлять поиск по вводу в символьное поле. Вот моя модель.

Я уже сделал фильтр для заголовка, и он работает соответственно.

class Post(models.Model):
    store_choices = [
            ('1', 'cafe'),
            ('2', 'dessert cafe'),
            ('3', 'coffee house'),
            ('4', 'restaurant')
        ]
    title = models.CharField(max_length=100)
    review = models.TextField(default='Paragraph 1', max_length=3000)
    store_type = models.CharField(choices=store_choices, max_length=100)

В моем файле views.py я создал класс фильтра и передал список store_type в контекст, чтобы я мог ссылаться на эти значения в своем шаблоне.

def PostFilter(request):
    qs = Post.objects.all()

    store_type = [
        ('cafe'),
        ('dessert cafe'),
        ('coffee house'),
        ('restaurant')
    ]

    title_query = request.GET.get('title')
    store_type_query = request.GET.get('store_type')

    if valid_query(title_query):
        qs = qs.filter(title__icontains=title_query)

    context = {
        'queryset': qs,
        'store_type': store_type
    }

    return render(request, 'blog/search.html', context)

Затем в моем HTML-шаблоне я пытаюсь сослаться на следующие категориальные значения:

<div class="container py-5">
  <form method="GET" action=".">
    <!-- Search by title -->
    <div class="form-row d-block">
      <div class="form-group col">
        <label for="title">Store Name</label>
          <div class="input-group">
            <input class="form-control py-2 border-right-0 border" type="search" name="title" placeholder="Name contains..." />
              <span class="input-group-append">
                <div class="input-group-text bg-transparent">
                  <i class="fa fa-search"></i>
                </div>
              </span> 
          </div>
    </div>
    <!-- Search by store type-->
    <div class="row">
      <div class="form-group col-6">
        <div class="container mt-4 mb-4">
        <label for="storetype">Store Type</label>
          <select class="form-control" name="store_type">
            <option selected>Choose...</option>
            {% for store in store_type %}
              <option value="{{ store }}"> {{ store }} </option>
            {% endfor %}
          </select>
        </div>

Опять же, мой метод фильтрации работает нормально, когда дело доходит до фильтрации по вводу символьного поля, но я не могу получить работающий фильтр, использующий метод выпадающего меню (опция выбора).

...