Отдельная презентация от логики с помощью WTForms
-
21-12-2019 - |
Вопрос
Я просто знакомлюсь с Flask, WTForms (и flask-WTF).Я чувствую, что чего-то не хватает.
Согласно Документы WTForms "HTML-код вашего поля формы может быть сгенерирован для вас, но мы позволяем вам настроить его в ваших шаблонах.Это позволяет вам сохранить разделение кода и представления и исключить эти запутанные параметры из вашего кода на python."
Предлагаемый метод моделирования HTML-радиовходов заключается в следующем:
class ExmapleForm(Form):
language = RadioField(u'Programming Language', choices=[('py', 'Python'), ('js', 'JavaScript')])
....и предлагаемый способ шаблонирования HTML-радиовходов таков:
{% for subfield in form.radio %}
<tr>
<td>{{ subfield }}</td>
<td>{{ subfield.label }}</td>
</tr>
{% endfor %}
При таком подходе разве свойство choices, "представляющее собой последовательность пар (значение, метка)", не смешивает презентацию с моделями?
Есть ли способ переместить метку в шаблон и сопоставить ее со значением?
Решение
Интересный вопрос.Если мы мыслим в терминах шаблона MVC, я думаю, что список вариантов, которые находятся в выпадающем списке, принадлежит модели, а не представлению.Поэтому я бы не хотел, чтобы эти варианты были определены дизайнером в шаблоне.Я полагаю, мы согласны в этом, не так ли?
Лучше иметь список вариантов, жестко заданный в форме, как в вашем примере, но это также не идеально.Предположительно, у вас есть Language
модель или аналогичная сущность, верно?Эта модель является авторитетной в отношении допустимых вариантов языка программирования, поэтому именно она должна предоставлять список допустимых вариантов любому, будь то форма или другая подсистема.
Как вы упомянули в своем вопросе, у каждого варианта есть внутреннее имя и отображаемое имя.И поскольку мы говорим о строках отображения, давайте не будем забывать, что u'Programming Language'
заголовок для вашего поля относится к той же категории отображаемых строк.Должны ли эти строки входить в компетенцию дизайнера шаблона?Я не знаю, это серая зона между моделью и презентацией, я думаю, дизайнер должен иметь полномочия в отношении того, как все выглядит, но не в отношении контента.
Если вы хотите иметь больше контроля над тем, как выглядят эти отображаемые строки, вы могли бы использовать инструментарий перевода, такой как gettext (например, через Flask-Babel).Если ваше приложение отображает текст с помощью gettext, вы можете сопоставить любые строки из кода или шаблона с другими строками.Это используется для перевода на другие языки, но вы также можете использовать его для отдельного управления отображением строк на родном языке приложения.Сопоставление выполняется во внешнем файле данных, поэтому я думаю, что это обеспечивает независимость, которую вы ищете.
Другие советы
от чисто теоретической точки зрения, которая, кажется, не является хорошей идеей.Если вам пришлось подключить метку с фактическим значением в шаблоне, это будет означать иметь бизнес-логику в шаблоне.
Кроме того, как бы вы предполагали, что точный код делает это?Это потребует контекста подполя в операторе, назначенном метке.Я не могу представить, что код выглядит хорошо в шаблоне.И будет ли это часть логики презентации, как она должна?
Вот решение, с которым я придумал (для поддержания разделения).Это может быть излишне, но я собираюсь попробовать его и посмотреть, как он масштабируется.
в формах. PYPY:
import sys
sys.path.append("templates")
import constants
class ExmapleForm(Form):
language = RadioField('language', choices=constants.languages['choices'], validators=constants.languages['validators'])
.
Тогда я создал файл в папке шаблонов, называемых константами .py:
from wtforms.validators import InputRequired
languages = {
'choices': [
('py', 'Python'),
('js', 'JavaScript')
],
'validators': [
InputRequired(message = 'Please Select')
]
}
.
Надеюсь, это поможет (и работает)