2 Stimmen

Jinja2 gibt "None" String für Google App Engine Modelle zurück

Google App Engine Modelle, wie z.B.:

from google.appengine.ext.db import Model

class M(Model):
    name = db.StringProperty()

Dann in einer Jinja2-Vorlage, die von einer Django-Ansicht mit einer Instanz von M eingegeben als m :

The name of this M is {{ m.name }}.

Wenn m wird initialisiert ohne name eingestellt ist, wird Folgendes gedruckt:

Der Name dieses M ist None.

Die bevorzugte und erwartete Ausgabe (und die Ausgabe bei Verwendung von Django-Vorlagen) wäre/ist:

Der Name dieses M ist .

Wissen Sie, warum dieses Problem auftritt und wie man die gewünschte und erwartete Ausgabe erhält?

0 Stimmen

Es ist erwähnenswert, dass die Festlegung eines Standardwerts, ala. name = db.StringProperty(default="") behebt dieses Problem. Das Problem scheint zu sein, dass m.name ist NoneType, es sei denn, es gibt einen Standardwert.

0 Stimmen

Ihre Klasse sollte die Unterklasse db.Model , etwa so: class M(db.Model): -- Ändert das etwas?

0 Stimmen

@Jason Hall - Danke für den Hinweis. Das behebt das Problem leider nicht.

14voto

JJ Geewax Punkte 9847

Sie könnten auch in Betracht ziehen, das "oder" von Jinja2 zu verwenden...

The name of this M is {{ m.name or ''}}.

Wenn bool(m.name) == False wird dies zeigen The name of this M is .


Wenn m.name == False und Sie möchten sie als "False" anzeigen, können Sie den "Standard"-Filter von Jinja2 verwenden:

The name of this M is {{ m.name|default('') }}

Wenn m.name is None wird dies zeigen The name of this M is .

Wenn m.name == False wird dies zeigen The name of this M is False.


Wenn Sie den Standardfilter verwenden und trotzdem alles, was mit Falsch bewertet wird, als Ihren definierten Standardwert anzeigen lassen möchten, fügen Sie einen zusätzlichen Parameter hinzu:

The name of this M is {{ m.name|default('', true) }}

Dies sollte genau die gleiche Wirkung haben wie {{ m.name or '' }} .


All diese Informationen finden Sie unter Jinja2's Eingebaute Filter Referenz

1voto

Jason Hall Punkte 20201

Ich glaube, Sie haben die Antwort selbst gefunden. Wenn Sie keinen Namen für diese Eigenschaft angeben, scheint App Engine sie als "None" zu speichern, nicht als "", so dass sie beim Drucken als "None" gedruckt wird. Geben Sie den Standardwert "" an und Ihr Problem ist gelöst, wie Sie sagten.

0 Stimmen

Es ist bemerkenswert, dass Sie dieses Problem möglicherweise beheben können, indem Sie mit class jinja2.Undefined zu.

1voto

XYZPDQ Punkte 11

Was ist, wenn er nicht will, dass eine leere Zeichenkette der Standardwert ist?

Ich selbst habe dieses Problem. Ich möchte keine leere Zeichenkette darin haben. Ich will null/None/NoneType. Das ist nicht dasselbe wie ein leerer String.

Also stelle ich die Frage noch einmal an alle --- Jinja besteht darauf, "None" zu übersetzen. Wie kommt das?

0 Stimmen

Ich denke, Sie können dieses Problem durch Überladen lösen jinja2.Undefined < jinja.pocoo.org/api/#undefined-types > und die Übergabe als undefined Parameter zu Ihrem jinja2.Environment .

0 Stimmen

Versuchen, den Jinja-Filter "Standard" zu verwenden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X