Итак, у меня есть простая рекламная модель и FilterView, показывающая все объявления. Объявления можно фильтровать по разным тегам, хранящимся в отдельной модели, объединенной с помощью ManyToManyField.
Я использую django-filter для настройки небольшого ModelMultipleChoiceFilter и позволяю пользователям выбирать разные теги для фильтрации рекламы. Это работает, однако использует tag__id. Я хотел бы использовать поле tag__slug.
Поэтому я добавил атрибут "to_field_name='slug'", но получаю следующее;
Поле «id» ожидало число, но получило «закусочная».
Следующий код работает, но фильтрует только по tag__id, например:
/?теги=6
и я хотел бы видеть что-то вроде этого;
?tags=закусочная
модели.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
фильтры.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'
]
Как я могу добиться фильтрации на основе имени модели или слага вместо идентификатора?
С наилучшими пожеланиями,