Подтвердить что ты не робот

Django - использовать шаблонный тег и 'with'?

У меня есть собственный тег шаблона:

def uploads_for_user(user):
    uploads = Uploads.objects.filter(uploaded_by=user, problem_upload=False)
    num_uploads = uploads.count()
    return num_uploads

и я хотел бы сделать что-то вроде этого, поэтому я могу плюрализовать правильно:

{% with uploads_for_user leader as upload_count %}
    {{ upload_count }} upload{{ upload_count|pluralize }}
{% endwith %}

Однако uploads_for_user leader не работает в этом контексте, потому что тег 'with' ожидает единственное значение - Django возвращает:

TemplateSyntaxError at /upload/
u'with' expected format is 'value as name'

Любая идея, как я могу обойти это?

4b9b3361

Ответ 1

Вы можете превратить его в фильтр:

{% with user|uploads_for as upload_count %}

Ответ 2

Пока фильтр все равно будет работать, текущим ответом на этот вопрос будет использование тегов назначения, введенных в Django 1.4.

Таким образом, решение будет очень похоже на вашу первоначальную попытку:

{% uploads_for_user leader as upload_count %}
{{ upload_count }} upload{{ upload_count|pluralize }}

Обновление. В соответствии с тегами назначения docs устарели, так как Django 1.9 (теперь может быть просто simple_tag приводит к переменной шаблона и следует использовать вместо этого)

Ответ 3

В Django 1.9 django.template.Library.assignment_tag() лишается: simple_tag теперь может хранить результаты в переменной шаблона и должен использоваться вместо этого.

Итак, теперь простой тег мы можем использовать как:

Возможно, он сохранит результат тега в переменной шаблона чем прямое его вывод. Это делается с помощью аргумента as за которым следует имя переменной. Это позволяет вам выводить содержимое, где вы сочтете нужным:

{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>