2012-07-03 33 views
14

¿hay alguna manera en que podría enviar una clase de formulario (css) de python? Por ejemplo:Wtforms, agregue una clase a un formulario dinámicamente

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

Esto hace que un campo de texto simple, pero quiero que tiene campo de texto para la clase CSS de .companyName, es que es posible directamente desde Python?

Sé que puedo poner un id="companyName" directamente desde python, pero no la clase.

Ayuda.

Actualización: He intentado class_="companyName" y no funcionó, lo tengo:

__init__() got an unexpected keyword argument '_class' 

Respuesta

24

WTForms no permite definir las opciones de visualización (como nombre de la clase) en el campo de la inicialización. Sin embargo, hay varias maneras de evitar esto:

  1. Si todos los campos deben incluir un nombre de clase, así como una identificación a continuación, sólo tiene que pasar en cada campo de short_name a ella cuando se la procesa:

    <dl> 
    {% for field in form %} 
    <dt>{{field.label}}</dt> 
    <dd>{{field(class_=field.short_name)}}</dd> 
    {% endfor %} 
    </dl> 
    
  2. Crear un mixin custom widget que proporciona el nombre de clase:

    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

Gracias tú. ¡Muy útil! – verrochio

44

alternativa, se puede añadir la clase en su plantilla como esto para Jinja2:

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

Me salvas. ¡¡¡Sinceramente gracias !! –

+0

Me salvó también :) Esta es una solución maravillosa, no estoy seguro de por qué un ejemplo en esta línea no está en algún lugar de los documentos de WTForm – sofly

+2

Votaría diez veces si fuera posible, esta es una solución mucho mejor. Ahora puedo recostarme y ver WTForms rock ~~~ – benjaminz

0

En su plantilla, probarlo

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

En las funciones de Python no puede usar "clase" como argumento con nombre porque es una palabra clave de idioma. Por ejemplo, 'myfunc (class = 'xyz')' da como resultado un SyntaxError. El uso de 'myfunc (** {'class': 'xyz'})' como se muestra arriba evita ese problema. Gracias por tu ejemplo! – David

5

Uso render_kw si se utiliza WTForms >= 2.1:

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

+0

Me funciona a muchos días de edad, pero ahora no funciona. No recuerdo lo que hice entonces, pero casi me gusta su respuesta. Después de Ctrl + F5, el botón de enviar también muestra la clase ** btn btn-default **: - (... Cualquier posible error? 'WTForms == 2.1' y' Flask-WTF == 0.14.2' –

Cuestiones relacionadas