2014-12-15 7 views
7

Wie kann ich das in einer Django-Vorlage sauber machen? Grundsätzlich, wenn A, oder (B und C), möchte ich etwas HTML zeigen.Klammern in django if-Anweisung

ich dies im Grunde haben:

{% if user.is_admin oder something.enable_thing und user.can_do_the_thing%}

Nun, ein bisschen mehrdeutig das ist. Ich habe versucht,

{% if user.is_admin oder (something.enable_thing und user.can_do_thething)%}

Aber Sie Arent Klammerung erlaubt zu tun. Die Dokumentation sagt, dass ich verschachtelte ifs (oder elifs in diesem Fall, ich denke, es ist ein OR) verwenden, aber ich möchte nicht das gleiche HTML innerhalb von 2 if Blöcken, die sich schrecklich anhören.

+0

lassen Sie es ohne Paranthesis. Ich denke, es funktioniert;) –

+1

Sie möchten nicht verschachtelt werden, wenn die und Klammern sind ungültig in 'if' Block, daher klar Framework unterstützt nicht, was Sie für darüber hinaus und verschieben Sie Ihre komplexe Logik zu Vorlage Tags oder Ansichten. –

Antwort

4

können Sie die Prüfung in Ihrer Sicht durchführen und eine Markierung an den Kontext übergeben.

show_html = user.is_admin or (something.enable_thing and user.can_do_the_thing) 
context['show_html'] = show_html 

Dann in Ihrer Vorlage können Sie das Flag

{% if show_html %}

+2

Ich würde diese Logik nicht in eine Ansicht einfügen, sondern ein benutzerdefiniertes Tag verwenden –

+0

Was ist, wenn eine dieser Variablen eine Schleifeniterationsvariable sein muss? Django hat mich enttäuscht. – mehmet

9

Als Mihai Zamfir überprüfen Sie es wie erwartet kommentiert sollte funktionieren. Wie Django Dokumentation erwähnt:

Verwendung sowohl und und oder Klauseln innerhalb des gleichen Tages ist erlaubt, mit und mit höheren Vorrang als oder zB:

{% if athlete_list und coach_list oder cheerleader_list%}

wird wie interpretiert werden:

Wenn (Athletenliste und Trainerliste) oder Cheerleaderliste