2011-02-08 13 views

Respuesta

-1

Miré el código y encontré que la clase de campo define tanto __new__ como __init__. __new__ toma un montón de *args y **kargs. Por lo tanto, puede pasar rows=x cols=y en su creación de TextAreadField y debería funcionar. Observé que wtforms está creando una clase llamada "UnboundField" para tales casos, no conozco las implicaciones de eso ya que esto causaría problemas, si los hubiera. Pero el siguiente paso para crear TextAreaField es el mismo. (Eso es control va a __init__ llamar como antes.)

+0

Eso es lo que pensaba también, pero eso no funciona: "un argumento inesperado palabra clave 'filas'" –

13

Se supone que no debe hacerlo en el lugar donde declara el widget. Tienes que hacerlo en la plantilla. Por ejemplo:

{{form.content(rows='50',cols='100')}} 

Es necesario asegurarse de que las filas y columnas se especifiquen como una cadena.

+2

¿Estás seguro? No funciona para mi –

+0

Yo tampoco. Hay algunos casos de esquina que necesitan resolverse. – leonigmig

+0

por supuesto, funciona, 'content' es el nombre del campo. – Michelle

4

{{form.text(cols="35", rows="20")|safe}} está trabajando

3

Hay un tutorial sobre el frasco por nettuts+. Básicamente, funciona así:

from flask.ext import wtf 

class ContactForm(wtf.Form): 
    content = wtf.TextAreaField("Content", [validators.Required()]) 

y en su html:

<form action="" method="post"> 
    {{ form.content }} 
</form> 

En lugar de especificar el formato en HTML, puede especificarlo en el CSS, por ejemplo:

form textarea#content { 
    width: 100px; 
    height: 100px; 
    max-width: 100px; 
} 
+0

Este es un buen trabajo, pero no responde específicamente a la pregunta de cómo hacerlo puramente con Flask/Jinja2. – Breedly

1

Para su comodidad, agregue primero esta macro.

_formhelpers.html:

{% macro render_field(field) %} 
    <dt>{{ field.label }} 
    <dd>{{ field(**kwargs)|safe }} 
    {% if field.errors %} 
    <ul class=errors> 
    {% for error in field.errors %} 
     <li>{{ error }}</li> 
    {% endfor %} 
    </ul> 
    {% endif %} 
    </dd> 
{% endmacro %} 

esta macro y el código de esta manera. deberia de funcionar.

{% from "_formhelpers.html" import render_field %} 
<form action="" method="post"> 
    {{ render_field(form.content,rows=100, cols=100) }} 
</form> 

Espero que ayude!

0

Simplemente podría utilizar este widget de reemplazo que es recordar los valores por defecto para la prestación:

import wtforms.widgets.core 

class TextArea(wtforms.widgets.core.TextArea): 
    def __init__(self, **kwargs): 
     self.kwargs = kwargs 

    def __call__(self, field, **kwargs): 
     for arg in self.kwargs: 
      if arg not in kwargs: 
       kwargs[arg] = self.kwargs[arg] 
     return super(TextArea, self).__call__(field, **kwargs) 

Ahora puede añadir este nuevo widget a tu campo:

content = wtf.TextAreaField(
    'Content', 
    id='content-area', 
    widget=TextArea(rows=50,cols=100), 
    validators=[validators.Required()]) 

Ahora puede hacer que este campo sin ningún argumento adicional y obtener un área de texto de 50x100.

0

Aquí se muestra un ejemplo:

<div class="row"> 
    <div class="col-md-12"> 
     <div class="form-group"> 
      {{ wtf.form_field(form.notes, rows=5) }} 
     </div> 
    </div> 
</div> 
2

Mucho más simple; utilizar render_kw argumento al crear el campo:

port = IntegerField(u"HTTP port", validators=[DataRequired(), NumberRange(1025, 65535)], render_kw={'class': 'form-control'}) 
mytextarea = TextAreaField(u"Content", render_kw={'class': 'form-control', 'rows': 5}) 

Y luego procesar el archivo:

{{ field() }} 
Cuestiones relacionadas