Почему я получаю 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 помогло.