2010-04-23 16 views
11

Używam Django Messaging Framework do wyświetlania wiadomości do użytkownika w szablonie.Wyświetlanie komunikatów struktury wiadomości Django

jestem wyprowadzanie ich na szablonie tak:

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

Ten wysyła wszystkie komunikaty błędów, ostrzeżeń, sukces itp Zastanawiam się, czy ktoś miał jakieś pomysły jak wyświetlić tylko błąd komunikaty o coś takiego:

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

najlepszym mam wymyślić do tej pory to:

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

Jakieś pomysły? Z góry dzięki.

Odpowiedz

9

Można położyć ifequal:

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

Odwzorowanie poziomu wiadomości do zmiennej tekstowej może być skonfigurowany z MESSAGE_TAGS.

+0

Dziękuję za odpowiedź, ale to oznacza, że ​​muszę kilka razy powtórzyć błędy, aby wyprowadzić wszystkie błędy, a następnie wszystkie komunikaty o sukcesie. Chciałem samemu zebrać wszystkie błędy. – Arif

+1

Powinno to być: {%, jeśli "błąd" w message.tags%} –

+0

Dzięki. Zaktualizowałem moją odpowiedź. –

5

Trochę Faff, ale prawdopodobnie można to osiągnąć przez dodanie procesora kontekstowe niestandardowy szablon (por https://docs.djangoproject.com/en/dev/ref/templates/api/) - coś takiego

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} 

następnie dodać, że do swojej listy TEMPLATE_CONTEXT_PROCESSORS w settings.py , a następnie w szablonach można zrobić:

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

można zrobić wariację na ten sam zbudować mapowania DICT poziom błędu do wiadomości, a następnie iterację każdego dict.

3

odpowiedź Reto za działa na mnie w ten sposób

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

Czy naprawdę musisz ponownie wykonać pętlę? Wygląda na to, że robi się komunikat '{% elif 'error' in message.tags%}' (lub całkowicie niezależne 'if' po pierwszym) w pierwszej pętli też powinno działać, nie? – user558061

0

zdołałem tylko znaczniki szablonu:

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

Kluczem jest znacznik {% regroup %}.

ten wciąż ma pewne problemy, ponieważ atrybut tags zawiera extra_tags z message więc jeśli z niego skorzystać dostaniesz dodatkowy <ul> grupy.

W przyszłych wersjach (probably 1.7) pojawi się atrybut level_tag, więc problem wkrótce zniknie.


(Jak tylko atrybut level_tag jest dostępny)

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

Dobra odpowiedź do wyświetlania wszystkich wiadomości – ppython

1

można użyć następujących tagów, by sprawdzić wiadomości.

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

-1

Oczywiście można to zrobić z {% regroup %} tag ale trzeba użyć dictsort filter aswell jeśli chcesz działać poprawnie.Po pierwsze, tagi powinny być sortowane według nazwy, a następnie grupa:

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

robisz proste rzeczy skomplikowane –

Powiązane problemy