如何使用选择选项输入字段(从下拉菜单中进行选择)基于模型实例的分类属性来对其进行过滤

时间:2019-06-01 02:44:05

标签: django-models django-queryset django-filters

我有一个Blog 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>

同样,我的过滤方法在通过字符字段输入进行过滤时似乎可以正常工作,但是我似乎无法获得使用下拉菜单(选项选择)方法的有效过滤器。

0 个答案:

没有答案