2016-01-10 4 views
5

Я использую Flask для разработки веб-приложения. Я изначально делал HTML-формы вручную, а затем переключился на использование WTForms (это образовательный проект, поэтому я показываю каждый шаг построения проекта).Использование полей HTML5 с WTForms

Я немного смутился при попытке добавить поля формы HTML5, такие как EmailField. Я искал документацию WTForms и онлайн, и я не мог узнать, как создать WTForm с помощью HTML5 EmailField.

Затем я установил этот модуль https://pypi.python.org/pypi/wtforms-html5, который разрешил его, и все сработало. Но я был недоволен добавлением дополнительной зависимости, тем более, что он, похоже, не активно развивается (https://github.com/brutus/wtforms-html5).

Затем я оказался на странице WTForms github и обнаружил, что на самом деле есть поддержка всех новых полей HTML5, но эти поля не импортируются по умолчанию. https://github.com/wtforms/wtforms/blob/master/wtforms/fields/html5.py Поэтому вместо использования

from WTForms import EmailField 

Как можно было заключить из

from WTForms import TextField 

Один вместо должен использовать

from wtforms.fields.html5 import EmailField 

Я был ранее с использованием wtforms-html5 модуль следующим

from wtforms_html5 import EmailField 

Поэтому я изменил все вхождения wtforms_html5 на wtforms.fields.html5, и мое приложение работает точно так, как ожидалось.

Хорошо, спасибо за чтение всего фона. Теперь вопросы:

  • Почему не какой-либо из полей html5 (EmailField, DateField и т.д.), указанных в документации WTForms?

  • Почему не эти поля импортируются в WTForms по умолчанию, как и другие

  • Являются ли эти поля стабильны/предназначены для использования?

  • Что лучше всего подходит для импорта полей из WTForms?

Для текстового поля можно использовать любое из следующих действий:

from wtforms import TextField 
from wtforms.fields import TextField 
from wtforms.fields.simple import TextField 

Но EmailField, я должен использовать

from wtforms.fields.html5 import EmailField 

Я хотел бы:

from wtforms.fields import TextField 
from wtforms.fields import EmailField 

Но для этого потребуется добавить строку к полям [__init__][1] файл, который я не желаю делать, поскольку это образовательный проект, и это просто путает учащихся.

Ищу

  • Insight, почему WTForms не документ или импорта по умолчанию в полях html5
  • Любая причина продолжать использовать модуль стороннего wtforms-html5.

ответ

5

предисловие, я один из авторов и в настоящее время основным хранителем WTForms

Перед тем, как добраться до почему я должен упомянуть, действительно общий шаблон для людей, использующих WTForms является создание ваш собственный модуль, который объединяет все биты в единое пространство имен.

Например, в myapp/forms.py вы делаете что-то вроде:

from wtforms.fields import * 
from wtforms import widgets, Form as _Form 
from wtforms.fields.html5 import EmailField, 


class Form(_Form): 
    """Awesome base form for myapp. Includes CSRF by default""" 
    class Meta: 
     csrf = True 
     csrf_secret = 'secretpasswordhere' 

     @property 
     def csrf_context(self): 
      return get_current_request().session 

    # maybe add some methods you really wanted to have on your Form class 

Вы можете использовать выше как:

from myapp.forms import Form, TextField, EmailField, ... 

class UserForm(Form): 
    name = TextField(...) 
    email = EmailField(...) 

или попеременно с звездой импорта, как from myapp.forms import *

Вы отметите Я также включил подкласс пользовательских форм, который устанавливает CSRF и предоставляет контекст CSRF по умолчанию, что не является абсолютно необходимым. (Кстати Flask-WTF делает подобную установку CSRF для вас, если вы используете флягу, но дело в том, чтобы показать, как вы можете легко придумать свои собственные интеграции.)


Теперь почему.

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

В начале этого решения было принято решение о включении extensions для взаимодействия с различными библиотеками. Но это поставило проблему в том, что она значительно увеличила сложность и площадь поверхности тестирования, а также привела к выпуску WTForms нечетными способами (Django просто изменил эту вещь, теперь вам нужно выпустить новые WTForms). Поэтому в 2015 году мы приняли решение перенести все расширения на свои собственные пакеты, чтобы позволить им их собственный график выпуска.

Вместо того, чтобы заставить людей использовать единый пакет, который пытается сделать все это привело к очень большой экосистемы формирующейся с твердыми пакетами компаньонов как Flask-WTF, WTForms-Alchemy и WTForms-Django назвать несколько.

Что касается того, почему типы HTML5 не документированы; ну, это упущение. Кроме того, некоторая история: в какой-то момент мы переключили вывод по умолчанию WTForms на выходе из XHTML-стиля в HTML-синтаксис; но сохранял основные выходы поля. Итак, мы получили людей, способствующих возвращению форм XHTML, людей, вносящих html5-поля, и людей, желающих использовать поля по умолчанию, использующие типы HTML5, после того, как мы гарантировали обратную совместимость в основной версии, что немного заставило нашу руку.


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

+0

Спасибо за очень полезный и подробный ответ. Является ли документация также о github? Я был бы рад сделать быстрый отчет и добавить подраздел в раздел «Поля», в котором упоминается, что доступны поля HTML5, и как обращаться к ним - если вы и другие сторонники слишком мало ресурсов для выполнения так. Я думаю, что многие люди на данный момент, вероятно, следуют маршруту, который я взял, и установке (или написанию) пакета сторонних пакетов для повторного добавления этих полей. – Sixhobbits

1

Автор WTForms HTML5 здесь. Просто быстро возглавлял проект: он «не поддерживался» в некотором смысле, что он работал для меня, и мне нечего было добавлять. Поскольку ванильные WTForms начали поддерживать все это, я рекомендую использовать простые WTForms.

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

Смежные вопросы