Django переводы с parler - показывать текст на языке по умолчанию при добавлении перевода
Я работаю над Django CMS с контентом, который должен быть переведен на несколько языков. Я использую django-parler.
Для облегчения перевода я бы хотел, чтобы текст с языка по умолчанию был виден при добавлении переведенного текста, желательно прямо над полем ввода/текстовой областью.
Есть идеи, как решить эту проблему?
Вы можете переопределить метод 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 - переводимые поля.
Теперь это создает 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

