2016-03-21 12 views
1

Ich muss einen Container <div> für meine Nachrichten nur erstellen, wenn es mindestens eine Nachricht mit level == DEFAULT_MESSAGE_LEVELS.ERROR. (Dann werde ich durch meine Nachrichten iterieren und rendern die mit Fehler-Tags).Wie für die Existenz eines bestimmten Levels in Django Nachrichten

In Pseudo-Code, so etwas wie diese:

{% for message in messages %} 
    {% if 'error' in message.tags %} 
    <div id="error-container"> 
    {% break %} <!-- break doesn't exist --> 
    {% endif %} 
{% endfor %} 

Was ist der sauberste Weg, dies in der Vorlage zu tun? Ich glaube nicht, dass die Templating-Sprache expressiv genug ist, um die Schleife durch messages zu brechen, wenn sie eine mit einem Fehler-Tag findet. Gibt es eine Möglichkeit firstof oder |first Filter zu verwenden, um die <div> nur beim ersten Auftreten einer error Nachricht Tag zu erstellen?

Antwort

1

Es ist nichts eingebaut. Ich würde vorschlagen, Ihren eigenen Kontextprozessor oder Schablonen-Tag/Filter zu schreiben, der diejenigen mit dem Level ERROR extrahiert. Als Filter könnte es so aussehen:

@register.filter 
def get_errors_only(messages): 
    return [message for message in messages if 'error' in message.tags] 

nun in der Vorlage können Sie einfach tun:

{% with messages|get_errors_only as error_messages %} 
    {% if error_messages %} 
    .. 
    {% endif %} 
{% endwith %} 

nicht {% load your_custom_templatetags %} Modul in Ihrer Vorlage zu laden Vergessen, und aktualisieren Sie Ihre settings.py Verwenden Sie die zusätzlichen Templatetags gemäß the docs.

+0

Danke, ich denke, dies ist die beste Trennung von Geschäfts- und Präsentationslogik, und ich werde die "get_errors_only" auch in vielen anderen Vorlagen wiederverwenden. – Escher

1

können Sie ifchanged tag verwenden:

{% for message in messages %} 
    {% if 'error' in message.tags %} 
     {% ifchanged 1 %} 
      <div id="error-container"> 
     {% endifchanged %} 
    {% endif %} 
{% endfor %} 

Oder Filter messages in View-Funktion und übergeben es an Vorlage.

from itertools import islice 

def view(request): 
    return render(request, 'path/to/template.html', { 
     'messages': islice((m for m in messages if 'error' in m.tags), 1), 
    }) 
Verwandte Themen