Django переводы с parler - показывать текст на языке по умолчанию при добавлении перевода

Я работаю над Django CMS с контентом, который должен быть переведен на несколько языков. Я использую django-parler.

Для облегчения перевода я бы хотел, чтобы текст с языка по умолчанию был виден при добавлении переведенного текста, желательно прямо над полем ввода/текстовой областью.

enter image description here

Есть идеи, как решить эту проблему?

Вы можете переопределить метод get_form в классе Admin и обновить атрибут виджетов placeholder. Например, если у меня есть следующая модель:

from django.utils.translation import gettext_lazy as _
from parler.models import TranslatableModel, TranslatedFields

class KeyCard(TranslatableModel):
    translations = TranslatedFields(
        series=models.CharField(_('series'), max_length=255, blank=True, null=True),
        skill=models.CharField(_('skill'), max_length=255, blank=True, null=True),
    )

Тогда я могу использовать

from django.contrib import admin
from parler.admin import TranslatableAdmin
from parler.utils.context import switch_language

@admin.register(KeyCard)
class GuideAdmin(TranslatableAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        with switch_language(obj, 'de'):
            for field in ['series', 'skill']:
                form.base_fields[field].widget.attrs['placeholder'] = getattr(obj, field)
        return form

Где de - мой язык по умолчанию, а поля series и skill - переводимые поля.

Django admin panel, with placeholders for the translations.

Теперь это создает placeholders, который исчезнет при наборе, в качестве альтернативы вы можете использовать:

form.base_fields[field].widget.attrs['value'] = getattr(obj, field)

Чтобы получить там действительное значение, такое, чтобы его можно было непосредственно сохранить.

Теперь, если вы не хотите самостоятельно отслеживать переводимые поля, вы можете использовать:

for field in obj._parler_meta.get_all_fields():
    form.base_fields[field].widget.attrs['placeholder'] = getattr(obj, field)

В результате вы получите все переводимые поля.

Примечание:

  • value не будет работать на models.TextField
Вернуться на верх