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
相关产品推荐
相关产品推荐

