如何在Django中过滤MultiSelectFields?

时间:2019-04-17 17:22:19

标签: django-filters

我有一个具有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过滤时,它消失了所有配置文件。我该如何工作?

0 个答案:

没有答案