2011-02-08 11 views

risposta

-1

Ho esaminato il codice e ho trovato che la classe Field definisce sia __new__ e __init__. __new__ prende un gruppo di *args e **kargs. Quindi, puoi semplicemente passare rows=x cols=y nella tua creazione di TextAreadField e dovrebbe funzionare. Ho notato che wtform sta creando una classe chiamata "UnboundField" per questi casi, non conosco le implicazioni di ciò come se ciò causasse problemi, se ce ne fossero. Ma il prossimo passo per creare TextAreaField è lo stesso. (Questo è il controllo va a __init__ chiamata come prima.)

+0

Questo è quello che ho pensato troppo, ma che non funziona: "Un argomento chiave inaspettato 'righe'" –

13

Non si dovrebbe farlo nel posto in cui si dichiara il widget. Hai fatto nel modello. Per esempio:

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

necessità di assicurare le righe e colonne sono specificati come stringa.

+2

Sei sicuro? Non funziona per me. –

+0

Neanch'io. C'è qualche caso d'angolo che deve essere risolto. – leonigmig

+0

naturalmente funziona, 'content' è il nome del campo. – Michelle

4

{{form.text(cols="35", rows="20")|safe}} sta lavorando

3

C'è un tutorial su Flask da nettuts+. In pratica, funziona così:

from flask.ext import wtf 

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

e nel tuo html:

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

Invece di specificare il layout in HTML, è possibile specificarlo nel CSS, ad esempio:

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

Questo è un buon lavoro, ma non risponde in modo specifico alla domanda su come lo fai puramente con Flask/Jinja2. – Breedly

1

Per comodità, aggiungere prima questa 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 %} 

Importa questa macro e il codice in questo modo. dovrebbe funzionare.

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

Spero che sia d'aiuto!

0

Si potrebbe semplicemente utilizzare questo widget di sostituzione che sta ricordando i valori di default per il rendering:

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) 

Ora è possibile aggiungere questo nuovo widget per il vostro campo:

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

È ora possibile rendere questo campo senza argomenti extra e ottieni una textarea 50x100.

0

Ecco un esempio:

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

Molto più semplice; utilizzare render_kw argomento durante la creazione del 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}) 

E poi rendere il file:

{{ field() }} 
Problemi correlati