Ошибка '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 ""

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