Python Django 3中MultiSelectField的筛选搜索
现在,为了可用性,我将一些选择字段更改为多个选择字段。当我使用iexact和MultipleSelectField设置下拉筛选进行排序时,它不再受支持或不受支持 是否有一种方法可以使用唯一的单个值对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 当前,前端显示为每个新条目创建的
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}
和您的带有开放过滤器的图像,它是一个字符串吗?