Django-filter中ModelChoiceFilter显示slug而非翻译name字段求助
解决方案
方法一:修正Type模型的__str__方法
下拉选项显示的内容默认由关联模型的__str__方法决定,你当前的Type模型应该是返回了slug字段,改成返回翻译后的name字段即可:
from django.db import models from modeltranslation.translator import register, TranslationOptions class Type(models.Model): name = models.CharField(max_length=100) slug = models.SlugField(unique=True) def __str__(self): return self.name # 替换原来返回self.slug的逻辑 @register(Type) class TypeTranslationOptions(TranslationOptions): fields = ('name',)
django-modeltranslation会自动根据当前语言环境返回对应的name翻译值,这样下拉选项就会显示对应语言的名称。
方法二:自定义label_from_instance(不修改模型__str__)
如果不想改动Type模型的__str__方法(比如其他业务场景需要保留slug作为显示),可以在ModelChoiceFilter中通过label_from_instance参数指定选项显示内容:
class SalePropertyFilter(FilterSet): # ...其他筛选字段 type = ModelChoiceFilter( queryset=Type.objects.all(), empty_label=_("Any type"), label="", widget=forms.Select(attrs={'class': 'form-control'}), label_from_instance=lambda obj: obj.name # 强制显示name字段 )
为什么type__name无效?
type__name是用于跨字段查询的语法,但ModelChoiceFilter的选项显示逻辑和查询字段无关,它只关注关联模型实例的显示文本,所以修改字段名不会改变下拉选项的内容。
内容的提问来源于stack exchange,提问作者Michael Romanov
相关产品推荐
相关产品推荐

