Как отображать/видеть значения по умолчанию в Admin для переведенных полей с помощью modeltranslation в Django
Я пытаюсь перевести некоторые модели в существующем проекте и изучаю, как это сделать с помощью расширения modeltranslate. Для эксперимента я добавил испанский язык в качестве дополнительного к английскому и установил английский язык по умолчанию в settings.py
:
INSTALLED_APPS = [
...
'modeltranslation',
'django.contrib.admin',
'debug_toolbar'
...
]
gettext = lambda s: s
LANGUAGES = (
('en', gettext('English')),
('es', gettext('Spanish')),
)
MODELTRANSLATION_DEFAULT_LANGUAGE = 'en'
MODELTRANSLATION_PREPOPULATE_LANGUAGE = 'en'
MODELTRANSLATION_AUTO_POPULATE = True
Модель:
class Equipment(models.Model):
name = models.CharField(max_length=300)
def __str__(self):
return self.name
admin.py
:
class EquipmentAdmin(TranslationAdmin):
ordering = ('name',)
translation.py
:
@register(Equipment)
class EquipmentTranslationOptions(TranslationOptions):
fields = ('name',)
При попытке отредактировать объект "Оборудование" сейчас в приборной панели я вижу два пустых текстовых поля со следующими именами:
Но оригинальное поле имени и его значение не отображаются. Даже в таблице модели теперь вообще не отображаются имена, как можно видеть здесь:
Вопросы:
- How can I see the original value of these translated fields?
- How do I keep seeing Equipment names in the overall model's view (the second screenshot)?
"Django Modeltranslate" создает новые поля базы данных, в вашем случае name_en
и name_es
, не удаляя исходное поле name
.
Вам нужно будет скопировать содержимое старого поля name
в сгенерированное, и я думаю, что простым способом является написание пользовательской миграции. Вы можете создать файл в папке migrations вашего приложения, с содержимым, подобным этому, и выполнить команду migrations:
def _copy_initial_names(apps, schema_editor):
from your_app.models import Equipment
for e in Equipment.objects.all():
e.name_es = e.name
e.name_en = e.name
e.save()
class Migration(migrations.Migration):
dependencies = [
('your-app', '00xx_migration_when_modeltranslation_installs'),
]
operations = [
migrations.RunPython(_copy_initial_names)
]
Вы можете сделать это, выполнив sql-запрос к вашей базе данных или иным способом, но при миграции вам не нужно помнить, что это нужно сделать в другой среде или в будущем.