2016-03-21 6 views
1

レベル== DEFAULT_MESSAGE_LEVELS.ERROR.のメッセージが1つ以上ある場合にのみ、メッセージ用にコンテナ<div>を作成する必要があります(メッセージを繰り返してレンダリングしますエラータグ付きのもの)。擬似コードでdjangoメッセージのあるレベルの存在をテストする方法

、このような何か:

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

テンプレートでこれを行うためのクリーンな方法は何ですか?テンプレートの言語がエラータグ付きで見つかった場合、messagesにループを壊すほど表現力があるとは思わない。 firstofまたは|firstフィルタを使用して、errorメッセージタグが最初に出現したときにのみ<div>を作成する方法はありますか?ビュー機能で

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

あるいは、フィルタmessagesを、テンプレートに渡し:

答えて

1

組み込みのものはありません。私はレベルERRORのものを抽出する独自のコンテキスト・プロセッサーまたはテンプレート・タグ/フィルターを作成することをお勧めします。

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

は、あなたのテンプレートに{% load your_custom_templatetags %}モジュールをロードすることを忘れて、あなたのsettings.pyを更新しないでください:あなただけ行うことができますテンプレートに今

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

:フィルタとして、それは次のようになります。 the docsとして余分なテンプレートタグを使用します。

+0

私はこれがビジネスロジックとプレゼンテーションロジックの最適な分離だと思うし、他の多くのテンプレートでも 'get_errors_only'を再利用しています。 – Escher

1

あなたはifchanged tagを使用することができます。

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), 
    }) 
関連する問題