因此,我有一个简单的广告模型和一个显示所有广告的FilterView。可以通过存储在由ManyToManyField连接的单独模型中的不同标签来过滤广告。
我正在使用django-filter设置一个小的ModelMultipleChoiceFilter,并允许用户选择其他标签来过滤广告。这正在工作,但是它使用了tag__id。我希望它使用tag__slug字段。
因此,我添加了属性“ to_field_name ='slug'”,但得到了以下内容;
字段“ id”需要一个数字,但得到了“晚餐”。
以下代码确实有效,但只能通过tag__id进行过滤,例如:
/?tags = 6
我宁愿看到这样的东西;
?tags = diner
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
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)的过滤?
最诚挚的问候,
答案 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
中找到。