Ошибка 'Invalid filter: 'length_is' в шаблоне Django - как исправить?
В моем проекте Django при рендеринге шаблона возникает ошибка TemplateSyntaxError. Сообщение об ошибке выглядит следующим образом: TemplateSyntaxError at
/admin/dashboard/program/add/
Invalid filter: 'length_is'
Django Version: 5.1
Python Version: 3.12.4
Error Location: This error appears in a Django template at line 22 of the fieldset.html file.
{% for line in fieldset %}
<div class="form-group{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
<div class="row">
{% for field in line %}
<label class="{% if not line.fields|length_is:'1' and forloop.counter != 1 %}col-auto {% else %}col-sm-3 {% endif %}text-left" for="id_{{ field.field.name }}">
{{ field.field.label|capfirst }}
{% if field.field.field.required %}
<span class="text-red">* </span>
{% endif %}
</label>
<div class="{% if not line.fields|length_is:'1' %} col-auto fieldBox {% else %} col-sm-7 {% endif %}
{% if field.field.name %} field-{{ field.field.name }}{% endif %}">
Что я пробовал:
Проверено для пользовательских фильтров:
Я просмотрел свой проект и установленные в нем пакеты, чтобы проверить, существует ли пользовательский фильтр с именем length_is. Я обнаружил, что в моем проекте не определен такой пользовательский фильтр.
Проверенная установка Django:
Я убедился, что Django правильно установлен и обновлен до версии 5.1.
Просмотренный код шаблона:
Я внимательно изучил код шаблона, который вызывает ошибку. Я обнаружил, что используется строка line.fields|length_is:'1', но фильтр length_is не является стандартным фильтром Django.
Поиск ошибок в пакетах:
Я просмотрел документацию и отчеты об ошибках, связанные с django-jazzmin, чтобы выяснить, есть ли там упоминание о проблеме с фильтром length_is, но не смог найти соответствующей информации.
То, что я ожидал:
Я ожидал найти либо:
Документация или ссылка, указывающая на то, что length_is - это стандартный фильтр Django или фильтр, предоставляемый внешним пакетом. Руководство по определению или реализации фильтра length_is, если это пользовательский фильтр, не включенный по умолчанию.
Резолюция, указывающая на то, что проблема может быть связана с несоответствием версий или конфигурацией, которую можно легко устранить.
Поскольку я не смог найти никакой полезной информации или документации об этом фильтре, я не знаю, как действовать дальше. Любая помощь в определении или правильном использовании фильтра length_is в шаблонах Django будет очень признательна.
Я столкнулся с той же проблемой с Django jazzmin, когда обновил свою версию Django. Вот как это исправить.
Шаг 1 - Создайте файл customtags.py
в одной из ваших папок apps
myapp/templatetags/customtags.py
Шаг 2 - Вставьте length_is
код из репозитория Django на GitHub
Шаг 3 - Добавьте относительный путь к файлу customtags в файл settings
. В разделе TEMPLATES
.
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates"],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
"django.template.context_processors.media",
"django.template.context_processors.i18n",
],
"builtins": ["myapp.templatetags.customtags"], # <- HERE
},
},
]
Источник: Как исправить удаленные теги шаблонов в админке Django
Не копируйте старый тег шаблона length_is
из Django 5.0.x
. Если он находится в репозитории upstream, предложите соответствующее изменение проекту (или используйте подход, описанный здесь: https://github.com/farridav/django-jazzmin/issues/593#issuecomment-2288096357 -- исправление ожидает слияния в: https://github.com/farridav/django-jazzmin/pull/519)
Этот фильтр шаблонов был удален в версии Django 5.1. Причину его удаления можно найти в Django 5.1 release notes и объяснить в исходном коде:
warnings.warn(
"The length_is template filter is deprecated in favor of the length template "
"filter and the == operator within an {% if %} tag.",
RemovedInDjango51Warning,
)
Для получения более подробной информации смотрите исходный код.
Рекомендуемое обновление
Вместо того чтобы использовать length_is:'n'
, обновите свой шаблон, чтобы использовать фильтр length
с оператором ==
:
Старый синтаксис:
{% if value|length_is:'n' %}...{% endif %}
Новый синтаксис:
{% if value|length == n %}...{% endif %}
Вы также можете обрабатывать альтернативные выходы следующим образом:
{% if value|length == n %}True{% else %}False{% endif %}
Этот подход соответствует рекомендуемой практике Django и обеспечивает совместимость ваших шаблонов с будущим.
Это можно решить, просто заменив все "length_is" в fild на "length ==". это сработало для меня .
я сделал то же самое, что уже ответил https://stackoverflow.com/users/4934984/tushortz. с небольшими изменениями. У меня сработало.
Я столкнулся с той же проблемой с Django jazzmin, когда обновил свою версию Django. Вот как это исправить.
Шаг 1 - Создайте файл customtags.py в одной из папок вашего приложения
myapp/templatetags/customtags.py Шаг 2 - Вставьте код length_is из репозитория Django на GitHub
Шаг 3 - Добавьте относительный путь к файлу customtags в файл настроек. В разделе ТЕМПЛАТЫ.
-------------- мой код --------------
# import warnings
# from django.utils.deprecation import RemovedInDjango51Warning
from django.contrib.admin import register
from django import template
register = template.Library()
@register.filter(is_safe=False)
def length_is(value, arg):
"""Return a boolean of whether the value's length is the argument."""
try:
return len(value) == int(arg)
except (ValueError, TypeError):
return ""