Поле шаблона 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 настройка - я предлагаю тщательно сравнить настройки вашего проекта на сайтах разработки и производства.

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