2012-07-03 18 views
14

c'è un modo per inviare una classe di un modulo (css) da python? Per esempio:Wtforms, aggiungere dinamicamente una classe a un modulo

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

Ciò rende un campo di testo semplice, ma voglio che campo di testo per avere la classe CSS di .companyName, è che possibile direttamente da Python?

So che posso inserire uno id="companyName" direttamente da python, ma non dalla classe.

Help.

Aggiornamento: ho provato class_="companyName" e non ha funzionato, ho ottenuto:

__init__() got an unexpected keyword argument '_class' 

risposta

24

WTForms non consente di impostare le opzioni di visualizzazione (come il nome della classe) nel campo di inizializzazione. Tuttavia, ci sono diversi modi per aggirare questo:

  1. Se tutti i campi dovrebbe includere un nome di classe, nonché un ID poi basta passare in ogni campo di short_name ad esso quando si esegue il rendering è:

    <dl> 
    {% for field in form %} 
    <dt>{{field.label}}</dt> 
    <dd>{{field(class_=field.short_name)}}</dd> 
    {% endfor %} 
    </dl> 
    
  2. Creare un custom widget intermedia che fornisce il nome della classe:

    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

Grazie tu. Molto utile! – verrochio

44

In alternativa è possibile aggiungere la classe nel modello come questo per Jinja2:

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

Mi salvi. Sinceramente grazie !! –

+0

Salvato anche me :) Questa è una soluzione meravigliosa, non sono sicuro del perché un esempio lungo queste linee non sia da qualche parte nei documenti WTForm – sofly

+2

Voterò dieci volte se è possibile, questa è una soluzione molto migliore. Ora posso sedermi e guardare WTForms rock ~~~ – benjaminz

0

Nel modello, provare

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

Nelle funzioni Python non è possibile utilizzare "class" come argomento con nome perché è una parola chiave della lingua. Ad esempio, 'myfunc (class = 'xyz')' produce un SyntaxError. Usando 'myfunc (** {'class': 'xyz'})' come mostrato sopra risolve il problema. Grazie per il tuo esempio! – David

5

Usa render_kw se si utilizza WTForms >= 2.1:

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

+0

Funziona per me molti giorni di età, ma è appena fallito ora. Non ricordo cosa ho fatto allora, ma quasi come la tua risposta. Dopo Ctrl + F5, il pulsante di invio mostra anche la classe ** btn btn-default **: - (... Eventuali errori? 'WTForms == 2.1' e' Flask-WTF == 0.14.2' –

Problemi correlati