2016-07-11 3 views
2

Ich bin eine Liste von Werten in Django mit jeweils einem Bit von einer beliebig langen BinaryField. In der Vorlage möchte ich Kontrollkästchen aktivieren, die den übereinstimmenden Bits entsprechen."Bitweise und" in Django Vorlagen

{% for element in elements %} 
    <li class="list-group-item 
     {% if selected_elements & element.value %} 
      list-group-item-primary active 
     {% endif %}" id="{{ element.value }}"> 
    {{ element.description }} 
    </li> 
    {% endfor %} 

selected_elements ist die unsigned integer Darstellung der Werte, die der Benutzer (unter der Annahme, die 91001 ist) ausgewählt. element.value ist eine geometrische Progression 1 2 4 8 ...

Also, die {% if selected_elements & element.value %} innerhalb der Schleife betrachten:

1001 & 0001 = True 
1001 & 0010 = False 
1001 & 0100 = False 
1001 & 1000 = True 
... all remaining elements => False 

jedoch die & scheint Probleme zu verursachen, wenn die Seite zugegriffen wird.

kann den Rest nicht analysieren: '&' von '&' (< Klasse django.template.exceptions.TemplateSyntaxError >‘)

Gibt es eine Möglichkeit Bit-Operatoren in Django zu verwenden (1.10) Vorlagen?

+0

Beachten Sie, dass '1001 0011'' 0001' ist, nicht 'False' – Alasdair

+3

Dies ist eine unnötig komplizierte Art, Dinge zu tun. Da Sie bereits in der Ansicht arbeiten müssen, um Ihren geometrischen Verlauf zu erhalten, sollten Sie diese Gelegenheit stattdessen nutzen, um Ihr Bitfeld in etwas Brauchbareres, dh eine Liste ausgewählter Werte, zu zerlegen. –

+0

Danke für die Antwort und den Vorschlag @DanielRoseman. Ich werde die Laufzeit und Auslastung in der Ansicht messen (Ihr Kommentar) v/s den benutzerdefinierten Filter (Ihre Antwort) und wählen Sie. – Jedi

Antwort

5

Die Django Template-Sprache unterstützt nicht bitweise Operationen, aber man konnte write a custom filter:

@register.filter 
def bitwise_and(value, arg): 
    return bool(value & arg) 

Dann in Ihrer Vorlage:

{% load bitwise_tags %} 
{% if selected_elements|bitwise_and:element.value %}