Почему я получаю NameError: name '_' is not defined при установке пользовательских шаблонов для djangocms-video?

Я пытаюсь заставить работать пользовательские шаблоны для djangocms-video.

На данный момент есть свежий проект djangocms, установленный с некоторым bootstrap и работающий нормально.

Согласно readme нам нужно указать это в settings.py, чтобы сделать доступным пользовательский шаблон (в данном случае шаблон с именем "feature"):

DJANGOCMS_VIDEO_TEMPLATES = [
    ('feature', _('Featured Version')),
]

После установки этого и запуска manage.py появляется эта ошибка:

    ('feature', _('Featured Version')),
NameError: name '_' is not defined

Согласно другим темам нам нужно импортировать gettext вот так в modely.py: from django.utils.translation import gettext as _ или вот так: django.utils.translation import ugettext_lazy as _

Пока не получается. Что я упускаю?

Вот некоторая информация об окружающей среде:

python --version
Python 3.9.2
pip list
Package                    Version
-------------------------- -----------
asgiref                    3.4.1
cssselect2                 0.4.1
dj-database-url            0.5.0
Django                     3.1.14
django-classy-tags         2.0.0
django-cms                 3.8.0
django-filer               2.1.2
django-formtools           2.3
django-js-asset            1.2.2
django-mptt                0.13.4
django-polymorphic         3.0.0
django-sekizai             2.0.0
django-treebeard           4.5.1
djangocms-admin-style      2.0.2
djangocms-attributes-field 2.0.0
djangocms-bootstrap4       2.0.0
djangocms-file             3.0.0
djangocms-googlemap        2.0.0
djangocms-icon             2.0.0
djangocms-installer        2.0.0
djangocms-link             3.0.0
djangocms-picture          3.0.0
djangocms-style            3.0.0
djangocms-text-ckeditor    4.0.0
djangocms-video            3.0.0
easy-thumbnails            2.8
html5lib                   1.1
lxml                       4.7.1
Pillow                     9.0.0
pip                        21.3.1
pkg_resources              0.0.0
pytz                       2021.3
pytz-deprecation-shim      0.1.0.post0
reportlab                  3.6.5
setuptools                 44.1.1
six                        1.16.0
sqlparse                   0.4.2
svglib                     1.1.0
tinycss2                   1.1.1
tzdata                     2021.5
tzlocal                    4.1
Unidecode                  1.1.2
webencodings               0.5.1

В Django функция gettext_lazy(…) [Django-doc] часто импортируется как _ для управления переводами. Это объясняется в Стандартный перевод:

Модуль gettext стандартной библиотеки Python устанавливает _() в глобальное пространство имен, как псевдоним для gettext(). В Django мы решили не следовать этой практике по нескольким причинам

.

(...)

Из-за того, как работает xgettext (используемый makemessages), только функции, которые принимают один строковый аргумент, могут быть импортированы как _:

Таким образом, вы должны добавить:

from django.utils.translation import gettext_lazy as _

в верхней части файла.

Если вы таким образом определите что-то вроде _('Featured Version'), вы можете запустить makemessages для генерации файлов перевода и заполнения перевода для каждого языка.

Добавление строки согласно @willen-can-onsems Answer в settings.py помогло.

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