You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:22:13