Как передать функцию с параметрами из представления в шаблон в Django?
Я передаю функцию из views.py в шаблон в Django. Эта функция принимает аргумент даты и возвращает разницу между ней и сегодняшней датой
views.py:
def days_until(date1):
td = datetime.date.today
temp = date1 - td
return temp.days
def index(request):
entries = Entry.objects.all()
return render(request, 'index.html', {'entries' : entries, 'days_until' : days_until})
index.html:
{% for entry in entries %}
<div> {{ days_until(entry.date) }} </div>
{% endfor %}
Этот код не работает и возвращает эту ошибку:
Не удалось разобрать остаток: '(entry.pwExp)' из 'days_until(entry.pwExp)'
Я предполагаю, что я не вызываю days_until неправильно. Как я должен передавать entry.date в эту функцию?
все, что вам нужно - это пользовательский фильтр шаблона django: https://docs.djangoproject.com/en/4.1/howto/custom-template-tags/
создайте файл my_filters.py в папке templatetags вашего приложения. напишите следующее:
from django import template
import datetime
register = template.Library()
@register.filter(name='days_until')
def days_until(date):
td = datetime.date.today
return (date - td).days
в шаблоне:
{% load my_filters %}
{% for entry in entries %}
<div> {{ days_until|entry.date }} </div>
{% endfor %}
Другая возможность - вы можете использовать менеджер шаблонов Jinja. https://docs.djangoproject.com/en/4.0/topics/templates/#django.template.backends.jinja2.Jinja2
здесь вы можете делать вызовы python в шаблонах.
Но это все неправильно. Вы могли сделать это раньше, в контексте создания:
entries = (days_until(entry.date) for entry in Entry.objects.all())
и после этого в шаблоне:
{% for entry in entries %}
<div> {{ entry }} </div>
{% endfor %}
Это намного лучше: мало кода и быстрее.