python Django有条件地显示与ForeignKey不同的列

ecfdbz9o  于 2023-10-14  发布在  Python
关注(0)|答案(2)|浏览(121)

我在我的Django项目中实现了翻译。翻译的最后一件事是翻译类别名称,这是由外键连接的不同模型。
我的模特:

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

    def __str__(self):
        return self.name

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

    class Meta:
        verbose_name_plural = "Categories"

class Note(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='note', null=True)
    title = models.CharField(max_length=200)
    note_text = models.TextField()
    add_date = models.DateTimeField('added date', auto_now_add=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, default=7)
    edit_dates = ArrayField(
        models.DateTimeField('edit dates', blank=True, null=True),
        default=list,
    )
    members = ArrayField(
        models.CharField(max_length=200)
    )
    allow_edits = models.BooleanField(default=True)

    def __str__(self):
        return self.title

在Category模型中是field name,它是类别的英文名称和field name_pl -类别的波兰语名称。
我的表格:

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")

我正在使用gettext_lazy翻译表单标签,但我不知道如何在语言的情况下使用不同的Category字段。我知道有一个函数get_language(),所以我可以这样做:

from django.utils.translation import get_language

if get_language() == 'en':
    fields = ['title', 'note_text', 'category.name',]
elif get_language() == 'pl':
    fields = ['title', 'note_text', 'category.name_pl',]

但这显然行不通。如何做到这一点?

06odsfpq

06odsfpq1#

你可以从你的视图中将语言传递给你的表单,比如;

form = AddNewNote(language=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', ]

    def __init__(self, *args, **kwargs):
        language = kwargs.get("language")
        super().__init__(*args, **kwargs)
        if language == 'en':
            self.fields.pop("title")

然而,你不能做的是,你试图在Note的表单中对相关模型上的字段做什么。
对于要修改的每个模型示例,都需要一个表单。因此,您需要为要修改的Category示例提供一个内联表单。这变得有点复杂,但文档是最好的开始。

o2gm4chl

o2gm4chl2#

解决办法比我想象的要简单。我所要做的就是检查models.py中的语言并返回正确的字段。

def __str__(self):
    lang = get_language()

    if lang == 'en':
        return self.name
    elif lang == 'pl':
        return self.name_pl

相关问题