2010-04-23 9 views
11

Ich habe die Django Messaging Framework verwendet, um Nachrichten an einen Benutzer in der Vorlage anzuzeigen.Anzeigen von Django-Nachrichten Framework-Nachrichten

ich sie auf die Vorlage wie folgt ausgebe:

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

Dies gibt alle Meldungen, Fehler, Warnung, Erfolg usw. Ich habe mich nur gefragt, ob jemand irgendwelche Ideen hatte, wie nur die Fehler angezeigt werden Nachrichten so etwas wie:

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

das beste, was ich mit so weit gekommen sind, ist dies:

{% 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 %} 

Irgendwelche Ideen? Vielen Dank im Voraus.

Antwort

9

können Sie eine IfEqual setzen:

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

Die Abbildung der Meldeebene in die Meldevariable kann mit MESSAGE_TAGS konfiguriert werden. so etwas wie

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} 

dann hinzufügen, dass die Liste Ihres TEMPLATE_CONTEXT_PROCESSORS in settings.py - einen eigenen Template Kontextprozessor durch Hinzufügen (vgl https://docs.djangoproject.com/en/dev/ref/templates/api/)

+0

Danke für Ihre Antwort, aber das bedeutet, dass ich die Fehler mehrere Male durchlaufen muss, um alle Fehler und dann alle Erfolgsmeldungen auszugeben. Ich wollte einen Weg, alle Fehler selbst zu erfassen. – Arif

+1

Es sollte sein: {% if 'error' in message.tags%} –

+0

Danke. Meine Antwort wurde aktualisiert. –

5

Ein bisschen eines faff, aber man kann dies wahrscheinlich erreichen und dann in Vorlagen können Sie tun:

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

Sie könnten eine Variation derselben tun ein dict Mapping-Fehler Ebene Nachricht zu bauen, und dann durch die einzelnen dict laufen.

3

Reto Antwort funktioniert für mich auf diese Weise

{% 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

Müssen Sie die Schleife wirklich erneut durchführen? Sieht so aus, als würde in der ersten Schleife ein '{% elif 'Fehler' in message.tags%}' (oder ein völlig unabhängiges 'if' nach dem ersten) funktionieren, nein? – user558061

0

ich nur mit Template-Tags verwaltet:

{% 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 %} 

Der Schlüssel ist der {% regroup %}-Tag.

Dies hat immer noch ein paar Probleme, weil das tags Attribut die extra_tags der message beinhaltet also, wenn Sie davon Gebrauch machen werden Sie <ul> Gruppen zusätzlich zu bekommen.

In zukünftigen Versionen (probably 1.7) wird es ein level_tag Attribut geben, so dass das Problem bald behoben sein wird.


(Sobald das level_tag Attribut verfügbar ist)

{% 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

Gute Antwort für die Anzeige aller Nachrichten – ppython

1

können Sie folgende verwenden Nachricht Tags zu überprüfen.

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

-1

Natürlich können Sie es mit {% regroup %} Tag tun, aber Sie haben dictsort filter als gut verwenden, wenn Sie richtig arbeiten wollen.Zuerst sollten die Tags nach Name und dann nach Gruppe sortiert werden:

{% 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

Sie machen einfache Dinge kompliziert –