У меня есть модель профиля с 2 MultiSelectFields и пользовательское поле, которое связывает модель профиля с моделью пользователя. Я хочу отфильтровать MultiSelectFields модели Profile для того, чтобы пользователи могли находить профили с комбинациями вариантов, которые эти MultiSelectFields имеют
Я попытался создать один фильтр MultipleChoiceFilter для каждого MultiSelectField и один 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, все профили исчезают. Как я могу сделать эту работу?