首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django 3中MultiSelectField的过滤搜索

Django 3中MultiSelectField的过滤搜索
EN

Stack Overflow用户
提问于 2021-01-30 18:18:29
回答 1查看 1.3K关注 0票数 1

现在,为了可用性,我将一些选择字段更改为多个选择字段。当我将下拉过滤设置为使用MultipleSelectField进行排序时,不再支持或不再支持它。

是否有一种方法可以使用唯一的单个值对MultiSelectField进行筛选搜索,以同时查找单个和多个结果。

想要的功能--,我正试着按每十年的一个选项对可以找到的多个选择字段进行排序。然后搜索查找单个或多个选择结果。

代码语言:javascript
复制
Select decade
1950s
...
2000
2010
2020

当前,前端显示为每个新条目创建的内容,因此如果单个组合,则为每个组合或单个条目创建一个独特的条目,使其变得丑陋和混乱。当每个选项只有一个选择,但是有许多组合的可能性现在也是唯一的时候,.distinct()工作得很好。我想我已经不再为过滤工作了。

代码语言:javascript
复制
Select decade
1950s, 1960s, 1970s
...
2000
2010, 2020
2020

在视图中搜索字段中的关键字。

act / views.py

代码语言:javascript
复制
# SEARCH BASED-KEYWORD
def search(request):
    act = Act.objects.order_by('-created_date')

    demographics_search = Act.objects.values_list('demographics', flat=True).distinct()
    defaultgenre_search = Act.objects.values_list('defaultgenre', flat=True).distinct()
    decade_search = Act.objects.values_list('decade', flat=True).distinct()
    genre_search = Act.objects.values_list('genre', flat=True).distinct()

    # if has keyword request from the url
    if 'keyword' in request.GET:
        keyword = request.GET['keyword']
        # check if keyword is not blank, find the keyword in the whole of the description
        if keyword:
            act = act.filter(description__icontains=keyword)

    # if has keyword request from the url
    if 'demographics' in request.GET:
        demographics = request.GET['demographics']
        # check if keyword is not blank, find the keyword in the whole of the description
        if demographics:
            act = act.filter(demographics__iexact=demographics)

    if 'defaultgenre' in request.GET:
        defaultgenre = request.GET['defaultgenre']
        # check if keyword is not blank, find the keyword in the whole of the description
        if defaultgenre:
            act = act.filter(defaultgenre__iexact=defaultgenre)

act / models.py

代码语言:javascript
复制
from django.db import models
from django.db.models import CharField
from django.utils import timezone
from ckeditor.fields import RichTextField
from multiselectfield import MultiSelectField

# Create your models here.

class Act(models.Model):

   artists_name = models.CharField(max_length=255)
   description = RichTextField(blank=True)
   call_to_action = models.CharField(max_length=255)
   artists_photo = models.ImageField(upload_to='photo/%y/%m/%d/')
   act_page_title = models.CharField(max_length=255)
   act_page_description = models.CharField(max_length=255)
   act_page_keywords = models.CharField(max_length=255)
   created_date = models.DateTimeField(auto_now_add=True)


   defaultgenre_choices = [
   ('Adult Contemporary','Adult Contemporary'),
           ('Classic Rock','Classic Rock'),
           ('Country Music','Country Music'),
           ('Disco & Funk','Disco & Funk'),
           ('Trap Music', 'Trap Music'),
           ('Folk Music', 'Folk Music'),
           ('Singer / Songwriter', 'Singer / Songwriter'),
           ('Latin Music', 'Latin Music'),
           ]

   defaultgenre = models.CharField(
   choices= defaultgenre_choices,
   max_length= 100,)

   decades_choices = [
       (1,'1950s'),
       (2,'1960s'),
       (3,'1970s'),
       (4,'1980s'),
       (5,'1990s'),
       (6,'2000s'),
       (7,'2010s'),
       (8,'2020s'),
       ]

   decade = MultiSelectField(max_length=100,
   choices= decades_choices,)


   def __str__(self):
       return self.artists_name

home.html

代码语言:javascript
复制
        <div class="search-box-4 sb-8">
            <form action="{% url 'search' %}" method="">
                <div class="form-group">
                    <input type="text" name="keyword" placeholder="Search by name" class="form-control">
                </div>

                <div class="form-group">
                    <select class="form-control search-fields" name="demographics">
                        <option selected="true" disabled="disabled">Demographics</option>
                        {% for demographics in demographics_search %}
                        <option value= "{{demographics}}">{{demographics}}</option>
                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    <select class="form-control search-fields" name="defaultgenre">
                      <option selected="true" disabled="disabled">Default Genres</option>
                      {% for defaultgenre in defaultgenre_search %}
                      <option value= "{{defaultgenre}}">{{defaultgenre}}</option>
                      {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    <select class="form-control search-fields" name="decade">
                      <option selected="true" disabled="disabled">Decade</option>
                      {% for decade in decade_search %}
                      <option value= "{{decade}}">{{decade}}</option>
                      {% endfor %}
                    </select>
                </div>

不使用多选择函数

没有多选择域的工作

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-30 22:07:39

根据你的decades_choices

decades_choices = (1,‘1950’),(2,‘1960’),(3,‘1970年代’),(4,‘1980年代’),(5,‘1990年代’),(6,‘2000年代’),(7,‘2010年代’),(8,‘2020年代’),

我想你的价值观是这样的:

代码语言:javascript
复制
<div class="form-group">
    <select class="form-control search-fields" name="decade">
      <option selected="true" disabled="disabled">Decade</option>
      <option value="7, 8">2010s, 2020s</option>
      <option value="8">2020s</option>
    </select>
</div>

那么,要按十年进行过滤,就必须这样做:

代码语言:javascript
复制
decade = request.GET.get("decade")
if decade:
    # convert string to list
    decade = decade.split(",")
    act = act.filter(decade=decade)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65971586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档