Можно ли определить, соответствует ли переменная шаблона в шаблоне 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 в вашем случае совершенно нецелесообразно.
Хорошо, у вас может быть та же проблема, что и у меня: модель формирует title()
свои ярлыки, поэтому ваше совпадение может не совпадать.
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, чтобы увидеть «Слышимый» вместо «слышимый».
Я согласен, но это больше похоже на комментарий, чем на ответ
Спасибо, что дал мне знать. Я возьму это на заметку.
Хорошо, подумал об этом. Нет, это ответ, потому что я решаю проблему X в задаче XY. Надеюсь, это помешает кому-то написать тег шаблона, который выполняет регулярные выражения, потому что у нас достаточно этого плохого дизайна, лежащего здесь на полу.
Я не против сущности, которую вы пытаетесь проецировать с помощью того, что вы написали. Я лично не нахожу ни теги шаблона привлекательными, ни сам DTL в современную эпоху SPA, а также указываю на то, что логику следует держать в поле зрения (по крайней мере, таково мое мнение), но это обычно выглядит как материал для комментариев из одного предложения, может быть, это так. это просто мое смешанное мнение о том, что такое ответ и насколько он должен быть кратким. Я немного не по теме, так что извините за это, просто попытался уточнить, что я имел в виду.
@Melvyn Если никто не заметит мою проблему на следующий день, я отдам вам должное. Мой код и ваш делают по сути одно и то же. Я понимаю ваш код и понимаю, почему он должен работать. Я изменил свое выражение «супер» на «супер()», как и вы. Я даже установил точку останова перед «если», чтобы убедиться, что я устанавливаю help_text в пустую строку в правильных полях. Но когда я печатаю «field.help_text» в шаблоне, он не пуст. Итак, что-то происходит между запуском init и рендерингом окончательного шаблона. Я не знаю, что это такое. Спасибо за ваши усилия!
Можете ли вы создать тестовый пример, подобный моему выше, который работает для вашей установки, и посмотреть, не пройдет ли тест шаблона? Я начинаю задаваться вопросом, импортируете ли вы не ту форму или просматриваете кеш. У библиотеки форм Django нет причин восстанавливать тексты справки, если они пусты, и я не вижу никаких других вызовов fields_for_model
, которые могли бы объяснить это.
@Melvyn Я бы хотел, но сейчас я не могу позволить себе тратить больше времени на эту проблему, тем более что у меня есть обходной путь. Я отдал вам должное и очень ценю ваш ответ и вашу настойчивость в попытке помочь мне отследить источник проблемы. Еще раз спасибо.
Я понимаю. Я надеюсь, что это изолированная проблема, а не проблема, которая появляется в других представлениях. Я пробовал еще несколько вещей, чтобы воспроизвести его, но просто не могу.