我有一个具有2个MultiSelectFields的配置文件模型和一个将配置文件模型关联到用户模型的用户字段。我想过滤个人档案模型的MultiSelectFields,以使用户可以找到具有这些MultiSelectFields所选项的组合的个人档案
我尝试为每个MultiSelectField创建一个MultipleChoiceFilter过滤器,并为用户名创建一个CharField。我还制作了一个视图,该视图返回带有所有配置文件和表单的html文件,以便过滤配置文件并检查过滤器是否有效。
我的模特:
class Profile(models.Model):
MUSIC_CHOICES = (
('Rock', 'Rock'),
('Punk', 'Punk'),
('Pop', 'Pop'),
('Hip-Hop', 'Hip-Hop'),
)
MUSIC_NATURE = (
('Drummer', 'Drummer'),
('Songer', 'Songer'),
('Guitarist', 'Guitarist'),
('Bassist', 'Bassist'),
('Lyricist', 'Lyricist '),
)
user = models.OneToOneField(User, on_delete=models.CASCADE)
music_category = MultiSelectField(choices=MUSIC_CHOICES, blank=True)
music_nature = MultiSelectField(choices=MUSIC_NATURE, blank=True)
filters.py中的我的过滤器:
import django_filters
from .models import Profile
from django import forms
class ProfileFilter(django_filters.FilterSet):
music_category = django_filters.MultipleChoiceFilter(choices=Profile.MUSIC_CHOICES, conjoined=True, required=False,
widget=forms.CheckboxSelectMultiple(),
)
music_nature = django_filters.MultipleChoiceFilter(choices=Profile.MUSIC_NATURE, conjoined=True, required=False,
widget=forms.CheckboxSelectMultiple(),
)
user__username = django_filters.CharFilter(label='Username', lookup_expr="contains")
class Meta:
model = Profile
fields = ['music_category', 'music_nature']
我的观点:
@login_required
def profile_search(request):
profile_list = Profile.objects.all()
profile_filter = ProfileFilter(request.GET, queryset=profile_list)
return render(request, 'profile_list.html', {'filter': profile_filter})
我的html文件:
{% extends 'base.html' %}
{% block content %}
<form method="get">
{{ filter.form.as_p }}
<button type="submit">Search</button>
</form>
<ul>
{% for profile in filter.qs %}
<li>{{ profile.user.username }} - {{ profile.get_full_name }}</li>
{% endfor %}
</ul>
{% endblock %}
当我用用户名过滤配置文件时,它起作用,但是当我用MultipleChoiceFilter过滤时,它消失了所有配置文件。我该如何工作?