Python Django Templates and testing si une variable est nulle ou une chaîne vide

je suis assez nouveau à django, mais j'ai de nombreuses années d'expérience dans le codage dans le monde java, donc je me sens ridicule de poser cette question - je suis sûr que la réponse est évidente et je ne la vois pas. Je n'arrive pas à trouver la bonne façon de cette requête dans google ou quelque chose... J'ai cherché dans les docs de django et soit il n'y est pas, soit je ne le vois pas. Tout ce que je veux faire est dans un test de modèle si le var n'est pas null ou une chaîne vide ou juste un tas d'espaces. J'ai une question où les espaces sont introduits dans mon domaine - un autre problème que j'ai, et nous le ferons... mais je veux que ma logique fonctionne malgré tout. Maintenant, parce que ma chaîne contient des espaces simplement faire ceci: {% si la leçon.assignment %} passe toujours même si Je ne le veux pas. J'ai cherché une fonctionnalité de type trim qui fonctionnerait entre {% %}, mais je n'arrive pas à trouver quoi que ce soit. J'ai essayé de bande, mais il ne fonctionne pas entre {% %}. Quelqu'un peut-il svp m'indiquer la direction de la réponse... quelques docs que j'ai peut-être manqué... quelque chose?

Merci une tonne à l'avance!

28
demandé sur PaulP1975 2011-07-10 00:03:17

5 réponses

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

.strip appelle str.strip() ainsi vous pouvez gérer les chaînes espace-seulement comme vides, alors que la vérification précédente s'assure que nous éliminons None premier (qui n'aurait pas le .strip() méthode)

preuve que cela fonctionne (en ./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'
47
répondu Shawn Chin 2011-07-09 20:43:21

Si lesson.assignment est un champ model, Vous pouvez définir une fonction helper dans votre model et l'utiliser:

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

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

alors utilisez {% if lesson.has_assignment %} dans votre modèle.

5
répondu Mike DeSimone 2011-07-09 20:21:13

cela n'était peut-être pas disponible lorsque la question a été affichée, mais une option pourrait être d'utiliser le filtre de modèle intégré default_if_none (Documentation De Django Lien).

Par exemple: {{ lesson.assignment|default_if_none:"Empty" }}

5
répondu Peter H 2016-05-18 19:57:06

Vous pouvez le simuler en utilisant le cut filtre pour supprimer tous les espaces. Mais vous devriez probablement découvrir pourquoi il contient tous les espaces en premier lieu.

1
répondu Ignacio Vazquez-Abrams 2011-07-09 20:13:43

vous pouvez appeler n'importe quelle méthode intégrée n'importe où dans une variable modèle Django. Par exemple, vous pouvez appeler la chaîne Python méthode strip. Donc ceci:

{% if lesson.assignment.strip %}
0
répondu Daniel Roseman 2011-07-09 20:20:32