Как отображать/видеть значения по умолчанию в 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',)

При попытке отредактировать объект "Оборудование" сейчас в приборной панели я вижу два пустых текстовых поля со следующими именами:

enter image description here

Но оригинальное поле имени и его значение не отображаются. Даже в таблице модели теперь вообще не отображаются имена, как можно видеть здесь:

enter image description here

Вопросы:

  1. How can I see the original value of these translated fields?
  2. 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-запрос к вашей базе данных или иным способом, но при миграции вам не нужно помнить, что это нужно сделать в другой среде или в будущем.

Вернуться на верх