Python Django 3中MultiSelectField的筛选搜索

Python Django 3中MultiSelectField的筛选搜索,python,django,django-models,django-filter,Python,Django,Django Models,Django Filter,现在,为了可用性,我将一些选择字段更改为多个选择字段。当我使用iexact和MultipleSelectField设置下拉筛选进行排序时,它不再受支持或不受支持 是否有一种方法可以使用唯一的单个值对MultiSelectField进行筛选搜索,以查找单个和多个结果 所需功能 我正在尝试使用下拉列表,对可以找到的多个选择字段进行排序,每十年只有一个选择。然后搜索以查找单个或多个选择结果 Select decade 1950s ... 2000 2010 2020 当前,前端显示为每个新条目创建的

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

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

所需功能 我正在尝试使用下拉列表,对可以找到的多个选择字段进行排序,每十年只有一个选择。然后搜索以查找单个或多个选择结果

Select decade
1950s
...
2000
2010
2020
当前,前端显示为每个新条目创建的内容,因此,如果单个组合,它会为每个组合或单个条目创建一个唯一的条目,因此有点难看和混乱。当每个选项只有一个选项时,.distinct()工作得很好,但现在有许多组合的可能性也是唯一的。我假设iexact不再用于过滤

Select decade
1950s, 1960s, 1970s
...
2000
2010, 2020
2020
在视图中,它在字段中搜索关键字

act/views.py

# 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)
 
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
act/models.py

# 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)
 
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

        <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>

人口统计学的
{人口统计信息中的人口统计信息百分比\u搜索%}
{{人口统计}
{%endfor%}
默认类型
{DefaultGene_search%}中DefaultGene的百分比为%
{{defaultgenre}}
{%endfor%}
十年
{十年中十年的百分比\u搜索%}
{{十年}
{%endfor%}
不使用multiselectfeild

在没有多个选择字段的情况下工作

根据您的
选择

我假设您的值如下所示:

<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>

MultipleSelectField返回一个值列表,根据这一行
{{decade}
和您的带有开放过滤器的图像,它是一个字符串吗?