2010-04-23 11 views
17

que tienen una etiqueta de plantilla personalizada:Django: ¿usar etiqueta de plantilla y 'con'?

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

y me gustaría hacer algo como esto, así que puede pluralizar correctamente:

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

Sin embargo, uploads_for_user leader no funciona en este contexto , porque la etiqueta 'con' espera un único valor - Django vuelve:

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

alguna idea de cómo se puede conseguir alrededor de esto?

Respuesta

22

Se podría convertirlo en un filtro:

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

Ah - Veo. Gracias :) – AP257

+3

Django 1.5+ te permite hacer esto de manera más sucinta. {% con upload_count = user | uploads_for%} [django with] (https://docs.djangoproject.com/en/1.5/ref/templates/builtins/#with) –

9

Mientras que un filtro aún funcionaría, la respuesta actual a esta pregunta sería utilizar assignment tags, introducido en Django 1.4.

Así que la solución sería muy similar a su intento original:

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

actualización: De acuerdo con las etiquetas de asignación docs están en desuso desde Django 1.9 (simple_tag ahora puede almacenar los resultados en una variable de plantilla y debe se puede usar en su lugar)

+2

Esto debe marcarse como el nuevo mejor responder. – imarban

+1

etiquetas de asignación en desuso desde 1.9 - editó la respuesta – Anupam

5

En Django 1.9 django.template.Library.assignment_tag() está privado: simple_tag ahora puede almacenar resultados en una variable de plantilla y debería usarse en su lugar.

lo tanto, ahora simple tag podemos utilizar como un:

Es posible almacenar los resultados de la etiqueta en una variable de plantilla en lugar de salida directamente. Esto se hace usando el argumento como seguido del nombre de la variable. Si lo hace, le permite mostrar el contenido de mismo donde mejor le parezca:

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