Как передать функцию с параметрами из представления в шаблон в 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 %}

Это намного лучше: мало кода и быстрее.

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