#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, потому что он не будет регистрировать фильтры, если вы не перезапустите сервер. Для меня это тоже было довольно раздражающе. Надеюсь, это поможет