Можете ли вы использовать регулярное выражение в условном шаблоне Django?

Можно ли определить, соответствует ли переменная шаблона в шаблоне Django регулярному выражению? В следующем шаблоне я хочу установить класс CSS для тега абзаца, содержащего текст справки, в зависимости от того, удовлетворяет ли текст справки для этого поля регулярному выражению. Вот шаблон с добавленным псевдокодом:

{% for field in form.visible_fields %}
  <div class = "form-group">
    {{ field.errors }}
    {{ field.label_tag }} {{ field }}
    {% if field.help_text %}
      {% if field.help_text|lower (BEGINS WITH SOME STRING) %}         # Pseudocode
        <p class = "select-help-text">{{ field.help_text|safe }}</p>
      {% else %}
        <p class = "help-text">{{ field.help_text|safe }}</p>
      {% endif %}
    {% endif %}
  </div>
{% endfor %}

Например, если help_text, как определено в связанной форме, начинается с текстовой строки «Удерживая нажатой клавишу Ctrl», тогда класс CSS должен быть установлен на select-help-text, в противном случае он должен быть просто установлен на help-text.

Я понимаю, что регулярные выражения Django основаны на регулярных выражениях Python, но оценки регулярных выражений Python всегда выполняются с использованием модуля re, который недоступен в шаблоне Django. Я также просмотрел документацию Django, но не смог найти способ сделать это.

ОБНОВЛЯТЬ

Я все еще не могу заставить этот код работать.

Мелвин, ответивший ниже, технически прав. Вам следует избегать использования условной логики в шаблонах Django. С этой целью я изменил свой шаблон в соответствии с документацией Django :

{% for field in form.visible_fields %}
  <div class = "form-group">
    {{ field.errors }}
    {{ field.label_tag }} {{ field }}
    {% if field.help_text %}
      <p class = "help-text">{{ field.help_text|safe }}</p>
    {% endif %}
  </div>
{% endfor %}

Затем я добавил метод __init__ в класс ModelForm форм, который просматривает метку для полей формы, в которых не должен отображаться текст справки, и устанавливает help_text значение «falsy», чтобы условие в шаблоне не выполнялось:

def __init__(self, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)
    for visible in self.visible_fields():
        if visible.field.label == 'foo' or visible.field.label == 'bar' or visible.field.label == 'baz':
            visible.field.help_text = False

Тем не менее, я все еще вижу текст справки, независимо от того, установил ли я help_text значение False или None или пустую строку. Это какая-то проблема со временем или я сделал ошибку, которую просто не вижу?

Это вызвано тем, как ModelForm переопределяет вещи. в основном, вместо этого вы должны переопределить Meta.help_texts. Я не нашел, где форма модели это делает, но с нормальной формой ваш код работает так, как ожидалось. Однако переопределение help_texts в вашем случае совершенно нецелесообразно.

user1600649 15.12.2020 20:50

Хорошо, у вас может быть та же проблема, что и у меня: модель формирует title() свои ярлыки, поэтому ваше совпадение может не совпадать.

user1600649 15.12.2020 20:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
521
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

DTL (язык шаблонов Django) не предназначен для программирования. На самом деле, я бы даже не стал писать тег шаблона для этого. В вашем представлении (или форме, или поле, или виджете) у вас есть все возможности изменить текст справки на 2-кортеж или словарь с меткой, так почему бы и нет;)

Возможно, лучший подход — в поле или виджете и просто добавить нужный класс в виджет на основе текста справки.

Переопределение полей формы модели

Итак, чтобы дать ответ на обновление, я использовал урезанный пример:

models.py

from django.db import models


class Sensor(models.Model):
    color = models.CharField(
        max_length=20, verbose_name = "visible", help_text = "Colors are visible"
    )
    sound = models.CharField(
        max_length=20, verbose_name = "audible", help_text = "Sounds are audible"
    )

forms.py


class BasicModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for visible in self.visible_fields():
            normalized = visible.label.lower()
            if "audible" == normalized:
                visible.help_text = ""

    class Meta:
        model = Sensor
        fields = "__all__"

tests.py

from django.template import Template, Context

class FormTest(TestCase):
    def test_modelform(self):
        form = BasicModelForm()
        self.assertEqual(form["sound"].help_text, "")

    def test_template(self):
        form = BasicModelForm()
        context = Context({"form": form})
        template = Template("{{ form.sound.help_text }} | {{form.color.help_text}}")
        actual = template.render(context)
        self.assertEqual(""" | Colors are visible""", actual)

Это не удалось, прежде чем нормализовать значение метки. Я использовал тест, чтобы PyCharm прервался при назначении, но он так и не дошел до назначения, поэтому я остановился на операторе if, чтобы увидеть «Слышимый» вместо «слышимый».

Я согласен, но это больше похоже на комментарий, чем на ответ

iklinac 14.12.2020 00:37

Спасибо, что дал мне знать. Я возьму это на заметку.

user1600649 14.12.2020 00:42

Хорошо, подумал об этом. Нет, это ответ, потому что я решаю проблему X в задаче XY. Надеюсь, это помешает кому-то написать тег шаблона, который выполняет регулярные выражения, потому что у нас достаточно этого плохого дизайна, лежащего здесь на полу.

user1600649 14.12.2020 00:47

Я не против сущности, которую вы пытаетесь проецировать с помощью того, что вы написали. Я лично не нахожу ни теги шаблона привлекательными, ни сам DTL в современную эпоху SPA, а также указываю на то, что логику следует держать в поле зрения (по крайней мере, таково мое мнение), но это обычно выглядит как материал для комментариев из одного предложения, может быть, это так. это просто мое смешанное мнение о том, что такое ответ и насколько он должен быть кратким. Я немного не по теме, так что извините за это, просто попытался уточнить, что я имел в виду.

iklinac 14.12.2020 01:26

@Melvyn Если никто не заметит мою проблему на следующий день, я отдам вам должное. Мой код и ваш делают по сути одно и то же. Я понимаю ваш код и понимаю, почему он должен работать. Я изменил свое выражение «супер» на «супер()», как и вы. Я даже установил точку останова перед «если», чтобы убедиться, что я устанавливаю help_text в пустую строку в правильных полях. Но когда я печатаю «field.help_text» в шаблоне, он не пуст. Итак, что-то происходит между запуском init и рендерингом окончательного шаблона. Я не знаю, что это такое. Спасибо за ваши усилия!

Jim 15.12.2020 23:22

Можете ли вы создать тестовый пример, подобный моему выше, который работает для вашей установки, и посмотреть, не пройдет ли тест шаблона? Я начинаю задаваться вопросом, импортируете ли вы не ту форму или просматриваете кеш. У библиотеки форм Django нет причин восстанавливать тексты справки, если они пусты, и я не вижу никаких других вызовов fields_for_model, которые могли бы объяснить это.

user1600649 16.12.2020 00:28

@Melvyn Я бы хотел, но сейчас я не могу позволить себе тратить больше времени на эту проблему, тем более что у меня есть обходной путь. Я отдал вам должное и очень ценю ваш ответ и вашу настойчивость в попытке помочь мне отследить источник проблемы. Еще раз спасибо.

Jim 17.12.2020 01:49

Я понимаю. Я надеюсь, что это изолированная проблема, а не проблема, которая появляется в других представлениях. Я пробовал еще несколько вещей, чтобы воспроизвести его, но просто не могу.

user1600649 17.12.2020 02:06

Другие вопросы по теме