web-dev-qa-db-de.com

Python Django Templates und Testen, ob eine Variable eine leere oder leere Zeichenfolge ist

Ich bin ziemlich neu in Django, habe aber schon viele Jahre Erfahrung in der Java-Welt. Ich fühle mich lächerlich, wenn ich diese Frage stelle - ich bin sicher, dass die Antwort offensichtlich ist und ich sie einfach vermisse. Ich kann anscheinend nicht den richtigen Weg finden, um dies bei google oder so etwas abzufragen ... Ich habe die Django-Dokumente durchsucht und es ist entweder nicht vorhanden oder ich sehe es einfach nicht. Alles, was ich tun möchte, ist in einem Vorlagentest, wenn die Variable nicht leer ist OR eine leere Zeichenfolge OR, sondern nur ein paar Leerzeichen. Ich habe ein Problem, bei dem Räume in mein Feld eingeführt werden - ein anderes Problem, das muss und werde ich klären ... aber ich möchte, dass meine Logik trotzdem funktioniert. Jetzt, da meine Zeichenfolge nur Leerzeichen enthält: {% if lesson.assignment%} wird immer durchlaufen, auch wenn ich es nicht will. Ich habe nach einer Ausstattungsfunktion gesucht, die zwischen {%%} funktionieren würde, aber ich kann anscheinend nichts finden. Ich habe Strip versucht, aber zwischen {%%} funktioniert es nicht. Kann mir jemand bitte in die Richtung der Antwort weisen ... einige Dokumente, die ich vielleicht übersehen hätte ... etwas?

Vielen Dank im Voraus! 

28
PaulP1975
{% if lesson.assignment and lesson.assignment.strip %}

.strip ruft str.strip() auf, damit Sie nur Whitespace-Strings als leer behandeln können. Die vorherige Überprüfung stellt jedoch sicher, dass wir None zuerst aussortieren (was die Methode .strip() nicht hätte).

Beweis, dass es funktioniert (in ./manage.py Shell):

>>> import Django
>>> from Django.template import Template, Context
>>> t = Template("{% if x and x.strip %}OK{% else %}Empty{% endif %}")
>>> t.render(Context({"x": "ola"}))
u'OK'
>>> t.render(Context({"x": "   "}))
u'Empty'
>>> t.render(Context({"x": ""}))
u'Empty'
>>> t.render(Context({"x": None}))
u'Empty'
51
Shawn Chin

Dies war möglicherweise nicht verfügbar, als die Frage gepostet wurde, aber eine Option könnte den integrierten Vorlagenfilter default_if_none ( Django Documentation Link ) verwenden. 

Zum Beispiel: {{ lesson.assignment|default_if_none:"Empty" }}

5
Peter H

Wenn lesson.assignment ein Modellfeld ist, können Sie eine Hilfsfunktion in Ihrem Modell definieren und verwenden:

class Lesson(models.Model):
    assignment = models.CharField(..., null=True, ...)
    # ...

    @property
    def has_assignment(self):
        return self.assignment is not None and self.assignment.strip() != ""

Verwenden Sie dann {% if lesson.has_assignment %} in Ihrer Vorlage.

5
Mike DeSimone

Sie können es simulieren, indem Sie mit dem Filter cut alle Leerzeichen entfernen. Aber Sie sollten wahrscheinlich herausfinden, warum es in erster Linie alle Leerzeichen enthält.

Sie können jede integrierte Methode an einer beliebigen Stelle in einer Django-Vorlagenvariablen aufrufen. Sie können beispielsweise die Python-String-Methode strip aufrufen. Also das wird funktionieren:

{% if lesson.assignment.strip %}
0
Daniel Roseman