Вопрос

Я просто знакомлюсь с 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')
    ]
}
.

Надеюсь, это поможет (и работает)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top