2010-04-23 17 views
11

He estado utilizando el Django Messaging Framework para mostrar mensajes a un usuario en la plantilla.Visualización de mensajes del marco de mensajes de Django

los estoy dando salida a la plantilla de la siguiente manera:

<ul> 
    {% for message in messages %} 
     <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 

Esto da salida a todos los mensajes, errores, advertencia, etc. éxito Me preguntaba si alguien tenía alguna idea de cómo mostrar sólo el error mensajes algo como:

<ul> 
    {% for message in messages.errors %} 
     <li>{{ message }}</li> 
    {% endfor %} 
</ul> 

El mejor que he encontrado hasta el momento es la siguiente:

{% if messages %} 
    {% for message in messages %} 
     {% if forloop.first %} 
      {% if message.tags == 'error' %} 
       <div class="error"> 
        <ul> 
      {% endif %} 
     {% endif %} 

     <li>{{ message }}</li> 

     {% if forloop.last %} 
       </ul> 
      </div> 
     {% endif %} 
    {% endfor %} 
{% endif %} 

¿Alguna idea? Gracias de antemano.

Respuesta

9

Usted puede poner ifequal:

<ul> 
    {% for message in messages.errors %} 
     {% if 'error' in message.tags %}<li>{{ message }}</li>{% endif %} 
    {% endfor %} 
</ul> 

El mapeo de nivel de mensaje a mensaje de la etiqueta se puede configurar con MESSAGE_TAGS.

+0

Gracias por su respuesta, pero eso significa que tengo que repetir los errores varias veces para dar salida a todos los errores y luego a todos los mensajes de éxito. Quería una forma de tomar todos los errores por sí mismos. – Arif

+1

Debe ser: {% si 'error' en message.tags%} –

+0

Gracias. Actualizado mi respuesta. –

5

Un poco de faff, pero que probablemente se podría lograr esto mediante la adición de un procesador contexto de la plantilla a medida (cf. https://docs.djangoproject.com/en/dev/ref/templates/api/) - algo así como

def collect_error_messages(request): 
    messages = get_messages(request) 
    error_messages = [ m for m in messages if 'error' in m.tags] 
    return {'error_messages': error_messages} 

continuación, añadir que a su lista de TEMPLATE_CONTEXT_PROCESSORS en settings.py , y luego en las plantillas que puede hacer:

<ul> 
    {% for message in error_messages %} 
     <li>{{ message }}</li> 
    {% endfor %} 
</ul> 

que podría hacer una variación sobre el mismo para construir un nivel de error de asignación a dict mensaje, y luego iterar a través de cada dict.

3

respuesta de Reto funciona para mí de esta manera

{% for message in messages %} 
    {% if 'success' in message.tags %} 

     <div class="alert alert-success"> 
      <a class="close" href="#" data-dismiss="alert">×</a> 
      <strong>Success!</strong> 

       {{ message }} 

     </div> 
    {% endif %} 
{% endfor %} 

{% for message in messages %} 
    {% if 'error' in message.tags %} 
     <div class="alert alert-error"> 
      <a class="close" href="#" data-dismiss="alert">×</a> 
      <strong>Error!</strong> 

       {{ message }} 

     </div> 
    {% endif %} 
{% endfor %} 
{% for message in messages %} 
    {% if 'info' in message.tags %} 
     <div class="alert alert-info"> 
      <a class="close" href="#" data-dismiss="alert">×</a> 
      <strong>INFO!</strong> 

       {{ message }} 

     </div> 
    {% endif %} 
{% endfor %} 
+2

¿Realmente necesita repetir el ciclo? Parece que hacer un '{% elif 'error' en message.tags%}' (o un 'if' completamente independiente después del primero) en el primer bucle también debería funcionar, ¿no? – user558061

0

he conseguido con sólo etiquetas de plantilla:

{% if messages %} 
    {% regroup messages by tags as messages %} 
    <div id="messages"> 
    {% for tags in messages %} 
     <ul class="{{ tags.grouper }}"> 
      {% for message in tags.list %} 
       <li>{{ message|capfirst }}</li> 
      {% endfor %} 
     </ul> 
    {% endfor %} 
    </div> 
{% endif %} 

La clave es la etiqueta {% regroup %}.

Esto todavía tiene un algunas cuestiones porque el atributo tags incluye la extra_tags del message así que si usted hace uso de él obtendrá adicional <ul> grupos.

En versiones futuras (probably 1.7), habrá un atributo level_tag, por lo que el problema desaparecerá pronto.


(Tan pronto como el atributo level_tag está disponible)

{% if messages %} 
    {% regroup messages by level_tag as messages %} 
    <div id="messages"> 
    {% for level in messages %} 
     <ul class="{{ level.grouper }}"> 
      {% for message in level.list %} 
       <li>{{ message|capfirst }}</li> 
      {% endfor %} 
     </ul> 
    {% endfor %} 
    </div> 
{% endif %} 
+0

Buena respuesta para mostrar todos los mensajes – ppython

1

puede utilizar después para comprobar las variables de aviso.

{% if message.tags == "error" %} your code here {% endif %}

-1

Por supuesto, puede hacerlo con la etiqueta {% regroup %} pero hay que usar dictsort filter aswell si desea que funcione correctamente.En primer lugar, las etiquetas deberían ordenarse por nombre y luego por grupo:

{% if messages %} 
    {% regroup messages|dictsort:"tags" by tags as message_list %} 

    {% for tags in message_list %} 
     <div class="alert alert-{{ tags.grouper }}"> 
      <div class="container"> 
       <ul> 
        {% for message in tags.list %} 
         <li> 
           {{ message }} 
         </li> 
        {% endfor %} 
       </ul> 
       <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> 
      </div> 
     </div> 
    {% endfor %} 
{% endif %} 
+0

estás haciendo cosas simples complicadas –

Cuestiones relacionadas