Django — не удается загрузить пользовательский фильтр в шаблоны

#python #django #django-templates

#python #django #django-шаблоны

Вопрос:

Я хочу показать дельта-время как «x дней назад». Я попробовал фильтр timesince от Django, но он возвращает «x дней, x минут». Я хочу показывать только дни. Я попробовал humanize naturaltime, но, думаю, это только для DateTimeField. Я использую DateField.

У меня есть такой пользовательский фильтр (app_filters.py );

 from django import template
from datetime import date

register = template.Library()


@register.filter(name='days_since')
def days_since(value):
    delta = value - date.today()

    if delta.days == 0:
        return 'Today'
    elif delta.days < 1:
        return '{} days ago'.format(abs(delta.days))
    elif delta.days == 1:
        return 'Tomorrow'
    elif delta.days > 1:
        return 'In {} days'.format(delta.days)
  

Это папка приложения;

 app/
    models.py
    views.py
    ...
    templatetags/
        __init__.py
        app_filters.py
  

Я добавил «приложение» в INSTALLED_APPS в settings.py
Я пытаюсь использовать этот фильтр в шаблонах, подобных этому;

 {% extends 'app/base.html' %}
{% load app_filters %}

{{ entry.date_updated | days_since }}
  

Затем я получаю сообщение об ошибке: ‘app_filters’ не является зарегистрированной библиотекой тегов.

В чем моя ошибка?

Комментарии:

1. Можете ли вы загрузить файл фильтра из оболочки? python manage.py shell Попробуйте что-то вроде from app.templatetags import app_filters . Также существует вероятность того, что где-то в app_filters.py и Джанго не передает это вам. Кроме того, простите за очевидный вопрос, но вы пытались перезапустить сервер?

2. Ошибок нет app_filters.py , я только что попробовал, и он работает просто отлично. Я столкнулся с той же ошибкой, что и вы, но в моем случае это было потому, что моя templatetags папка находилась в неправильном месте и, следовательно, не была обнаружена, даже если приложение было INSTALLED_APPS включено. Может ли это быть и в вашем случае?

3. попробуйте создать папку тегов вашего шаблона в каталоге проекта. Он будет работать так, как ожидалось.

Ответ №1:

Я понял, что мне нужно перезапустить веб-сервер для загрузки пользовательских фильтров шаблонов. В данном случае это решение.

Ответ №2:

У меня была аналогичная проблема: а также перезапуск убедитесь, что ваш filters.py классы находятся внутри INSTALLED_APPS для django, иначе они не будут подобраны.

Приложение, содержащее пользовательские теги, должно находиться в INSTALLED_APPS, чтобы тег {% load %} работал. Это функция безопасности: она позволяет размещать код Python для многих библиотек шаблонов на одном хост-компьютере, не предоставляя доступ ко всем из них для каждой установки Django.

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#howto-custom-template-tags

Ответ №3:

проблема может быть в самом django, потому что он не будет регистрировать фильтры, если вы не перезапустите сервер. Для меня это тоже было довольно раздражающе. Надеюсь, это поможет