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

Django中如何根据语言条件显示外键关联的不同分类字段?

解决Django中外键Category的多语言名称显示问题

方法一:修改Category模型,动态返回本地化名称

直接在Category模型中添加方法根据当前语言返回对应名称,并修改__str__方法调用它,这样所有用到Category显示名称的场景(包括表单下拉框、后台管理等)都会自动适配语言:

from django.utils.translation import get_language

class Category(models.Model):
    name = models.CharField(max_length=200)
    name_pl = models.CharField(max_length=200, default='none')
    slug = models.SlugField()

    def get_localized_name(self):
        current_lang = get_language()
        if current_lang == 'pl':
            return self.name_pl
        # 默认返回英文名称
        return self.name

    def __str__(self):
        return self.get_localized_name()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)

    class Meta:
        verbose_name_plural = "Categories"

修改后无需改动现有表单代码,下拉框中的Category选项会自动根据当前语言切换显示name或name_pl。

方法二:在表单中手动修改Category选项的显示文本

如果不想修改模型的__str__方法,可以在表单的__init__方法中手动替换category字段的选项标签:

from django.utils.translation import get_language

class AddNewNote(forms.ModelForm):
    file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={
        'multiple': True, 'style': 'font-size: 22px;'} 
    ), required=False)

    class Meta:
        model = Note
        fields = ['title', 'note_text', 'category', ]
        widgets = {
            'category': forms.Select(attrs={'style': 'font-size: 22px;'}),
            'title': forms.TextInput(attrs={'style': 'font-size: 22px;'}),
            'note_text': forms.Textarea(attrs={'style': 'font-size: 22px;'}),
        }

    def __init__(self, *args, **kwargs):
        super(AddNewNote, self).__init__(*args, **kwargs)
        self.fields['file_field'].label = _("Files")
        self.fields['title'].label = _("Title")
        self.fields['note_text'].label = _("Note text")
        self.fields['category'].label = _("Category")

        # 根据当前语言更新category选项的显示文本
        current_lang = get_language()
        category_choices = []
        for cat in Category.objects.all():
            if current_lang == 'pl':
                category_choices.append((cat.pk, cat.name_pl))
            else:
                category_choices.append((cat.pk, cat.name))
        self.fields['category'].choices = category_choices

为什么之前的方法无效?

你尝试在fields中写category.name或category.name_pl是错误的——表单的fields列表只能对应Note模型本身的字段(这里category是Note的外键字段),无法直接指定关联模型的属性。要修改外键选项的显示内容,需要调整选项的标签文本,而非修改字段列表。

内容的提问来源于stack exchange,提问作者keyboardNoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:35:42