Поле шаблона Wagtail по умолчанию in_preview_panel работает нормально в dev, но не работает в production
В шаблоне по умолчанию от Wagtail, даже упомянутом в Интернете здесь, есть часть:
{# Force all links in the live preview panel to be opened in a new tab #}
{% if request.in_preview_panel %}
<base target="_blank">
{% endif %}
Я расширяю этот базовый шаблон в других своих шаблонах.
В dev все нормально, но при запуске сайта в production я сталкиваюсь с такой ошибкой:
Exception while resolving variable 'in_preview_panel' in template 'home/home_page.html'.
Traceback (most recent call last):
File "/home/myusername/.local/lib/python3.12/site-packages/django/template/base.py", line 880, in _resolve_lookup
current = current[bit]
~~~~~~~^^^^^
TypeError: 'WSGIRequest' object is not subscriptable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/myusername/.local/lib/python3.12/site-packages/django/template/base.py", line 890, in _resolve_lookup
current = getattr(current, bit)
^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'WSGIRequest' object has no attribute 'in_preview_panel'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/myusername/.local/lib/python3.12/site-packages/django/template/base.py", line 896, in _resolve_lookup
current = current[int(bit)]
^^^^^^^^
ValueError: invalid literal for int() with base 10: 'in_preview_panel'
During handling of the above exception, another exception occurred:
...
Я понятия не имею, что такое in_preview_panel
и почему он ведет себя по-разному в dev и prod.
Если я удалю его, то эта ошибка будет устранена. У меня есть и другие проблемы в коде. Но я не хочу удалять это вслепую или воздействовать на админку Wagtail. Вместо этого я хочу понять, что происходит.
request.in_preview_panel
устанавливается в значение True, когда страница просматривается на панели предварительного просмотра в Wagtailadmin, и не определяется в противном случае. Приведенный здесь фрагмент кода использует это для вставки тега <base target="_blank">
(для открытия ссылок в новом окне) при предварительном просмотре страницы.
В шаблонном коде Django неопределенные переменные обычно игнорируются, поэтому при реальном просмотре страницы (не в режиме предварительного просмотра) {% if request.in_preview_panel %}
следует пропустить. По-видимому, это происходит правильно на вашем сайте разработки, но не в рабочей среде.
Во-первых, действительно ли страница перестает отображаться, или вы просто видите сообщения об ошибках в журналах, в то время как страница отображается нормально? Если это последнее, беспокоиться не о чем - это просто означает, что для ведения журнала установлен уровень отладки. Чтобы сделать его менее подробным, вы можете изменить его на ПРЕДУПРЕЖДЕНИЕ или ОШИБКУ в настройках вашего проекта.
Если это приводит к явному сбою, нам действительно нужно просмотреть полный отчет об ошибке, чтобы понять, что происходит, а не только тот раздел, который вы здесь процитировали. Я подозреваю, что в настройках вашего проекта может быть что-то нестандартное, например, string_if_invalid
настройка - я предлагаю тщательно сравнить настройки вашего проекта на сайтах разработки и производства.