2010-04-23 13 views
17

mam niestandardowy tag szablonu:Django - użyj tagu szablonu i "z"?

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

i chciałbym zrobić coś takiego, więc mogę pluralize odpowiednio:

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

Jednak uploads_for_user leader nie działa w tym kontekście , ponieważ znacznik "z" oczekuje pojedynczej wartości - Django zwraca:

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

Masz pomysł, jak sobie z tym poradzić?

Odpowiedz

22

Można przekształcić go w filtrze:

{% with user|uploads_for as upload_count %} 
+0

Ah - Rozumiem. Dziękuję :) – AP257

+3

Django 1.5+ pozwala zrobić to w bardziej zwięzły sposób. {% z upload_count = user | uploads_for%} [django z] (https://docs.djangoproject.com/en/1.5/ref/templates/builtins/#with) –

9

Podczas gdy filtr będzie nadal działać, obecna odpowiedź na to pytanie byłoby użyć assignment tags, wprowadzony w Django 1.4.

Zatem rozwiązaniem byłoby bardzo podobny do oryginalnego próbie:

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

aktualizacji: Jak na docs tagów przypisania są nieaktualne od Django 1.9 (simple_tag mogą teraz przechowywać wyniki w zmiennej szablonu i powinny zamiast tego użyj)

+2

To powinno być oznaczone jako nowe najlepiej odpowiedź. – imarban

+1

znaczniki przydziału wycofane od 1.9 - zredagowano odpowiedź – Anupam

5

W Django 1.9 django.template.Library.assignment_tag() jest zdyskwalifikowany: simple_tag może teraz przechowywać wyniki w zmiennej szablonu i powinny być użyte zamiast tego.

Więc teraz simple tag możemy używać jak:

Jest to możliwe do przechowywania wyników tag w zmiennej szablonu raczej niż bezpośrednio wyprowadzania go. Odbywa się to za pomocą argumentu jako argumentu , po którym następuje nazwa zmiennej. Takie postępowanie pozwala na wyjście zawartość samemu gdzie stosowne:

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