Как я могу отфильтровать MultiSelectFields в Django? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть модель профиля с 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, все профили исчезают. Как я могу сделать эту работу?

...