2012-07-03 7 views
14

Gibt es eine Möglichkeit, die Klasse (css) eines Formulars aus Python zu senden? Zum Beispiel:Wtforms, dynamisch eine Klasse zu einem Formular hinzufügen

class Company(Form): 
    companyName = TextField('Company Name', [validators.Length(min=3, max = 60)]) 

Dies macht ein einfaches Textfeld, aber ich mag, dass Textfeld die CSS-Klasse von .companyName haben, ist, dass direkt aus Python möglich?

Ich weiß, dass ich eine id="companyName" direkt aus Python, aber nicht Klasse setzen kann.

Hilfe.

Update: Ich versuchte class_="companyName" und es hat nicht funktioniert, ich habe:

__init__() got an unexpected keyword argument '_class' 

Antwort

24

WTForms Sie Anzeigeoptionen (wie Klassenname) auf dem Gebiet der Initialisierung gesetzt nicht gestattet. Allerdings gibt es mehrere Möglichkeiten, dies zu umgehen:

  1. Wenn alle Ihre Felder sollten einen Klassennamen sowie eine ID enthalten dann in jedem Feld des short_name es nur passieren, wenn Sie es machen:

    <dl> 
    {% for field in form %} 
    <dt>{{field.label}}</dt> 
    <dd>{{field(class_=field.short_name)}}</dd> 
    {% endfor %} 
    </dl> 
    
  2. erstellen custom widget mixin, die den Klassennamen lautet:

    from wtforms.fields import StringField 
    from wtforms.widgets import TextInput 
    
    class ClassedWidgetMixin(object): 
        """Adds the field's name as a class 
        when subclassed with any WTForms Field type. 
    
        Has not been tested - may not work.""" 
        def __init__(self, *args, **kwargs): 
         super(ClassedWidgetMixin, self).__init__(*args, **kwargs) 
    
        def __call__(self, field, **kwargs): 
         c = kwargs.pop('class', '') or kwargs.pop('class_', '') 
         kwargs['class'] = u'%s %s' % (field.short_name, c) 
         return super(ClassedWidgetMixin, self).__call__(field, **kwargs) 
    
    # An example 
    class ClassedTextInput(ClassedWidgetMixin, TextInput): 
        pass 
    
    class Company(Form): 
        company_name = StringField('Company Name', widget=ClassedTextInput) 
    
+0

ThankAlternativ können Sie die Klasse in der Vorlage, wie dies für jinja2 hinzufügen Sie. Sehr hilfreich! – verrochio

44
{{ form.name(size=20, class_='input-small') }} 
+0

Sie retten mich. Mit freundlichen Grüßen danke !! –

+0

Sparte mich auch :) Dies ist eine wunderbare Lösung, nicht sicher, warum ein Beispiel in dieser Richtung ist nicht irgendwo in der WTForm docs – sofly

+2

Ich würde zehn Mal abstimmen, wenn es möglich ist, ist dies eine viel bessere Lösung. Jetzt kann ich mich zurücklehnen und WTForms rocken ~~~ – benjaminz

0

in Ihrer Vorlage, versuchen Sie es

{{ form.companyName(**{'class': 'companyName'}) }} 
+2

In Python-Funktionen können Sie "class" nicht als benanntes Argument verwenden, da es sich um ein Sprachschlüsselwort handelt. Zum Beispiel führt 'myfunc (class = 'xyz')' zu einem SyntaxError. Die Verwendung des 'myfunc (** {'class': 'xyz'})' wie oben gezeigt, löst dieses Problem. Danke für dein Beispiel! – David

5

Verwenden render_kw bei Verwendung von WTForms >= 2.1:

submit = SubmitField(u'Block Submit Buttom', render_kw={"class": "btn btn-primary btn-block"})

+0

Es funktioniert für mich viele Tage alt, aber es ist jetzt gerade fehlgeschlagen. Ich erinnere mich nicht, was ich damals getan habe, aber fast genau wie deine Antwort. Nach Ctrl + F5 zeigt die Submit-Schaltfläche auch die Klasse ** btn btn-default **: - (... Mögliche Fehler? 'WTForms == 2.1' und' Flask-WTF == 0.14.2' –

Verwandte Themen