ModelMultipleChoiceFilter-字段“ id”应为数字,但为“晚餐”

时间:2020-02-06 08:07:00

标签: django django-filter django-widget django-filters

因此,我有一个简单的广告模型和一个显示所有广告的FilterView。可以通过存储在由ManyToManyField连接的单独模型中的不同标签来过滤广告。

我正在使用django-filter设置一个小的ModelMultipleChoiceFilter,并允许用户选择其他标签来过滤广告。这正在工作,但是它使用了tag__id。我希望它使用tag__slug字段。

因此,我添加了属性“ to_field_name ='slug'”,但得到了以下内容;

字段“ id”需要一个数字,但得到了“晚餐”。

以下代码确实有效,但只能通过tag__id进行过滤,例如:

/?tags = 6

我宁愿看到这样的东西;

?tags = diner

models.py

class Ad(models.Model):
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
    description = RichTextField()
    tags = models.ManyToManyField('Tag')
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, null=True)

    class Meta:
        ordering = ['-title']

    def __str__(self):
        return self.title

class Tag(models.Model):
    name = models.CharField(max_length=200, help_text='Titel van de tag')
    slug = models.SlugField(max_length=200, null=True)

    def __str__(self):
        return self.name

filters.py

from django import forms
from discovery.grid.models import Ad, Tag
import django_filters

class AdFilter(django_filters.FilterSet):
    tags = django_filters.ModelMultipleChoiceFilter(
        # to_field_name='slug', 
        queryset=Tag.objects.all(),
        widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Ad
        fields = [
            'tags'
        ]

如何实现基于模型名称或特性(而不是ID)的过滤?

最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

也许您可以这样尝试:

class AdFilter(django_filters.FilterSet):
    tags = CharFilter(method='my_custom_filter')

   def my_custom_filter(self, queryset, name, value):
       return queryset.filter(**{
           'tags__slug__iexact': value,
       })

    class Meta:
        model = Ad
        fields = [
            'tags'
        ]

更多信息可在documentation中找到。