web-dev-qa-db-fra.com

Modèles Python Django et test si une variable est une chaîne nulle ou vide

Je suis assez nouveau pour Django, mais j'ai de nombreuses années d'expérience dans le codage dans le monde Java. Je me sens donc ridicule de poser cette question. Je suis sûr que la réponse est évidente et qu'elle me manque. Je n'arrive pas à trouver le bon moyen d'interroger cela dans Google ou quelque chose comme ça ... J'ai fait une recherche dans la documentation Django et ce n'est pas là ou je ne le vois tout simplement pas. Tout ce que je veux, c’est faire un test de modèle si la variable var n’est pas null OR, une chaîne vide OR n’est qu’un tas d’espaces. J'ai un problème où des espaces sont introduits dans mon domaine - un autre problème que je dois et que je vais régler ... mais je veux que ma logique fonctionne de manière indépendante. Pour le moment, parce que ma chaîne ne contient que des espaces, il suffit de faire ceci: {% if lesson.assignment%} passe toujours, même si je ne le souhaite pas. J'ai recherché une fonctionnalité de type de rognage qui fonctionnerait entre {%%}, mais je n'arrive pas à trouver quoi que ce soit. J'ai essayé de déshabiller, mais cela ne fonctionne pas entre {%%}. Quelqu'un peut-il m'indiquer dans le sens de la réponse ... des documents que j'ai peut-être manqués ... quelque chose?

Merci beaucoup d'avance! 

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

Le .strip appelle str.strip() afin que vous puissiez gérer les chaînes d'espaces blancs uniquement, tandis que la vérification précédente vérifie que nous supprimons d'abord None (qui n'aurait pas la méthode .strip())

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'
51
Shawn Chin

Cela n'était peut-être pas disponible au moment de la publication de la question, mais l'une des options pourrait être d'utiliser le filtre de modèle intégré default_if_none ( Django Documentation Link ). 

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

5
Peter H

Si lesson.assignment est un champ de modèle, vous pouvez définir une fonction d'assistance dans votre modèle 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() != ""

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

5
Mike DeSimone

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

1

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

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