2016-01-10 6 views
5

Ich verwende Flask, um eine Webanwendung zu entwickeln. Ich habe ursprünglich HTML-Formulare manuell erstellt und bin dann zur Verwendung von WTForms übergegangen (dies ist ein Bildungsprojekt, daher zeige ich jeden Schritt beim Erstellen des Projekts).Verwenden von HTML5-Feldern mit WTForms

Ich habe ein bisschen verwirrt, wenn ich versuche, HTML5-Formularfelder wie EmailField hinzuzufügen. Ich habe die WTForms-Dokumentation und online durchsucht und konnte nicht herausfinden, wie ein WTForm mit einem HTML5-EmailField erstellt wird.

Ich habe dann dieses Modul https://pypi.python.org/pypi/wtforms-html5 installiert, die es erlaubt, und alles hat funktioniert. Aber ich war unglücklich darüber, eine zusätzliche Abhängigkeit hinzuzufügen, zumal es anscheinend nicht aktiv entwickelt wurde (https://github.com/brutus/wtforms-html5).

Ich endete dann auf der WTForms github-Seite und fand heraus, dass tatsächlich alle neuen HTML5-Felder unterstützt werden, diese Felder jedoch nicht standardmäßig importiert werden. https://github.com/wtforms/wtforms/blob/master/wtforms/fields/html5.py daher anstelle der Verwendung

from WTForms import EmailField 

Wie schließen aus

from WTForms import TextField 

man stattdessen verwenden, hat

from wtforms.fields.html5 import EmailField 

I wurde für die wtforms-html5 Modul als

folgt
from wtforms_html5 import EmailField 

Ich habe daher alle Vorkommen von wtforms_html5 zu wtforms.fields.html5 geändert und meine Anwendung funktioniert genau wie erwartet.

Ok, danke fürs Lesen des ganzen Hintergrundes. Nun zu den Fragen:

  • Warum ist keine der html5 Felder (EmailField, Datefield, usw.) in der WTForms Dokumentation erwähnt?

  • Warum wie die anderen sind nicht diese Felder

    standardmäßig in WTForms importiert
  • Sind diese Felder stable/zur bestimmungsgemäßen Verwendung?

  • Was ist die beste Vorgehensweise beim Importieren von Feldern aus WTForms?

Für Textfeld kann ich eine der folgenden Aktionen verwenden:

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

Aber für EmailField, ich habe

from wtforms.fields.html5 import EmailField 

verwenden würde Ich mag:

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

Aber das würde erfordern eine Zeile zu den FeldernhinzufügenDatei, die ich nicht tun möchte, da es ein Bildungsprojekt ist und dies würde die Lernenden nur verwirren.

Ich suche

  • Einblick, warum WTForms nicht dokumentiert oder durch Standard-Import die html5 Felder
  • Gibt es Gründe, mit der wtforms-html5 Dritt Modul fortzufahren.

Antwort

5

Vorwort, ich bin einer der Autoren und gegenwärtig die primären Betreuer der WTForms

Bevor ich zum bekommen, warum Ich soll ein wirklich gemeinsames Muster erwähne für Menschen WTForms verwenden, ist zu erstellen Ihr eigenes Modul, das alle gewünschten Bits in einem einzigen Namensraum zusammensetzt.

Zum Beispiel in myapp/forms.py tun Sie so etwas wie:

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 

Sie könnten die Verwendung oben wie:

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

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

oder abwechselnd mit einem Stern Import wie from myapp.forms import *

Sie werden bemerken, Ich fügte auch eine benutzerdefinierte Formularunterklasse hinzu, die CSRF einrichtet und standardmäßig einen CSRF-Kontext bereitstellt, was nicht unbedingt erforderlich ist. (Übrigens Flask-WTF funktioniert ähnlich CSRF-Setup für Sie, wenn Sie Kolben verwenden, aber der Punkt war zu zeigen, wie Sie leicht mit Ihrem eigenen Integration kommen können.)


Nun ist die, warum.

Die Kernidee von WTForms bestand darin, ein sehr einfaches, solides Framework zu entwickeln, das für die meisten Anwendungsfälle gut funktioniert, aber ausreichend erweiterbar ist, sodass die Benutzer Begleitwerkzeuge für bestimmte Anwendungsfälle bereitstellen können.

Schon früh war die Lösung, extensions für Interop mit verschiedenen Bibliotheken zu integrieren. Aber das stellte insofern ein Problem dar, als es die Komplexität und die Oberfläche des Testens stark erhöhte und WTForms Releases auf seltsame Weise antrieb (Django hat gerade dieses Ding geändert, jetzt müssen Sie einen neuen WTForms veröffentlichen). Deshalb haben wir 2015 beschlossen, alle Erweiterungen in ihre eigenen Pakete zu verschieben, um ihnen einen eigenen Veröffentlichungsplan zu geben.

Anstatt die Menschen zwingen, ein einzelnes Paket zu verwenden, alles zu tun versucht, dies in einem wirklich großen Ökosystem geführt hat mit soliden Begleiter Pakete wie Flask-WTF, WTForms-Alchemy und WTForms-Django Schwellen nur einige zu nennen.

Warum die HTML5-Typen nicht dokumentiert sind; Nun, das ist eine Unterlassung. Auch ein wenig Geschichte: An einem gewissen Punkt haben wir die Standard-WTForms-Feldausgabe von XHTML-Stil in HTML-Kompaktsyntax geändert; behielt aber die Kernfeldausgaben. Also haben wir Leute, die XHTML-Formulare zurückgeschickt haben, Leute, die html5-Felder beigesteuert haben, und Leute, die die Standardfelder mit HTML5-Typen wollten, nachdem wir Abwärtskompatibilität innerhalb einer Hauptversion garantiert hatten, was unsere Hand ein wenig erzwang.


Ich weiß, das ist eine lange Antwort, und vielleicht die kurze Weg zu sagen, es ist: Während WTForms im Allgemeinen mit den meisten Web-Frameworks aus der Box funktioniert, es wurde entwickelt, um Ihre Anwendungen konfiguriert und angepasst werden; nicht Plug and Play für alles.

+0

Danke für die wirklich hilfreiche und detaillierte Antwort. Ist die Dokumentation auch auf GitHub? Ich würde mich freuen, eine kurze Beschreibung zu schreiben und einen Unterabschnitt zum Abschnitt "Felder" hinzuzufügen, in dem erwähnt wird, dass die HTML5-Felder verfügbar sind und wie Sie darauf zugreifen können, wenn Sie und die anderen Betreuer zu wenig Ressourcen zur Verfügung haben damit. Ich denke, viele Leute folgen im Moment wahrscheinlich dem Weg, den ich gegangen bin, und installieren (oder schreiben) das Drittanbieter-Pip-Paket, um diese Felder wieder hinzuzufügen. – Sixhobbits

1

Autor von WTForms HTML5 hier. Nur ein kurzer Kopf über das Projekt: es "wurde nicht beibehalten" in einem Sinne, dass es für mich funktionierte und ich musste nichts hinzufügen. Da Vanille WTForms anfing, all diese Dinge zu unterstützen, empfehle ich nur einfache WTForms.

Wenn Sie einige automatisch generierte Renderschlüsselwörter für Ihre Widgets haben möchten, wurden in den aktuellen WTForms HTML5 Versionen alle Felder und Widgets gelöscht, die nun auch von WTForms unterstützt werden und stattdessen eine Meta-Klasse für Formulare verwenden.