2017-10-18 5 views
0

Ich habe gesehen, dass diese Datentypen nicht ihre Struktur nach der Verwendung firstof mit as halten. Zum Beispiel:firstof Verwendung mit Listenvariablen

{% firstof some_list some_string as value %} 

Wenn some_list über eine gültige Liste ist, wird es zu value zugeordnet. Aber wenn ich etwas wie {% if pk in value %} mache, schlägt es fehl, auch wenn es mit {% if pk in some_list %} gelingt. Wenn ich beide drucken:

{{some_list}} 
{{value}} 

geben sie die gleiche Leistung, aber ich denke Liste wird wahrscheinlich als Liste nicht gespeichert, nachdem firstof mit as verwenden. Gedanken?

Antwort

1

Zuweisen von some_list zu value funktioniert nicht wie erwartet. Die resultierende value ist vom Typ SafeText und nicht list. Dies kann überprüft werden, indem this answer verwendet wird, das ein benutzerdefiniertes Schablonen-Tag get_type hinzufügt, um den Typ einer Variablen abzurufen.

{% firstof some_list as value %} 
{{ some_list|get_type }} 
{{ value|get_type }} 

Welche zeigt folgendes:

<class 'list'> 
<class 'django.utils.safestring.SafeText'> 

am documentation Bei näherer Betrachtung heißt es, dass firstof:

Ausgänge das erste Argument Variable, die nicht falsch ist.

Mit ihrem Beispiel zeigt, dass {% firstof some_list some_string %} wird:

{% if some_list %} 
    {{ some_list }} 
{% elif some_string %} 
    {{ some_string }} 
{% endif %} 

Dies erklärt, warum value des SafeText Typ ist. Die Zuweisung weist dies einfach der Variablen value zu. Das scheint mir kein Fehler zu sein.

+0

Danke für die Erklärung. Weißt du, ob dies ein beabsichtigtes Verhalten oder ein Fehler ist? – Anupam

+0

Ich habe die Dokumentation besser gelesen und die Antwort aktualisiert. – ikkuh

+0

Hmm, nicht ganz sicher. Wenn es die Ausgabe einer Variablen zuweist, sollte die Variable den Typ des zugewiesenen Wertes haben (sonst wird die Zuweisung nicht viel nutzen)? – Anupam

Verwandte Themen