it-roy-ru.com

Python Django Шаблоны и проверка, является ли переменная нулевой или пустой строкой

Я довольно новичок в Django, но у меня многолетний опыт программирования в мире Java, поэтому я чувствую себя нелепо, задавая этот вопрос - я уверен, что ответ очевиден, и я просто скучаю по нему. Кажется, я не могу найти правильный способ сделать запрос в Google или что-то в этом роде ... Я искал документы Django, и его либо нет, либо я просто не вижу его. Все, что я хочу сделать, это в шаблонном тесте, если переменная не равна нулю OR, пустая строка OR, просто набор пробелов. У меня есть проблема, когда в моей области появляются пробелы - еще одна проблема, с которой я должен и буду работать ... но я хочу, чтобы моя логика работала независимо. Прямо сейчас, потому что моя строка содержит только пробелы, просто делая это: {% if lesson.assignment%} всегда проходит, даже если я этого не хочу. Я искал функциональность типа обрезки, которая работала бы между {%%}, но я не могу ничего найти. Я пробовал раздеться, но он не работает между {%%}. Может кто-нибудь, пожалуйста, укажите мне в направлении ответа ... некоторые документы, которые я мог пропустить ... что-то?

Большое спасибо заранее! 

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

.strip вызывает str.strip(), поэтому вы можете обрабатывать строки, содержащие только пробелы, как пустые, в то время как предыдущая проверка гарантирует, что мы сначала отсеем None (который не имеет метода .strip())

Доказательство того, что это работает (в ./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

Это может быть недоступно, когда вопрос был опубликован, но одним из вариантов может быть использование встроенного фильтра шаблонов default_if_none ( Django Documentation Link ). 

Например: {{ lesson.assignment|default_if_none:"Empty" }}

5
Peter H

Если lesson.assignment - это поле модели, вы можете определить вспомогательную функцию в вашей модели и использовать ее:

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

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

Затем используйте {% if lesson.has_assignment %} в своем шаблоне.

5
Mike DeSimone

Вы можете смоделировать его с помощью фильтра cut , чтобы удалить все пробелы. Но вы, вероятно, должны выяснить, почему он содержит все пробелы.

1
Ignacio Vazquez-Abrams

Вы можете вызывать любые встроенные методы в любом месте переменной шаблона Django. Например, вы можете вызвать строковый метод Python strip. Так что это будет работать:

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