2016-03-03 4 views
1

Я выполняю этот учебник http://flask.pocoo.org/docs/0.10/patterns/wtforms/Jinja, Flask и WTForms: как передать параметры в поле?

Вот пример _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 %} 

Здесь шаблон register.html, который использует шаблон _formhelpers.html:

{% from "_formhelpers.html" import render_field %} 
<form method=post action="/register"> 
    <dl> 
    {{ render_field(form.username) }} 
    {{ render_field(form.email) }} 
    {{ render_field(form.password) }} 
    {{ render_field(form.confirm) }} 
    {{ render_field(form.accept_tos) }} 
    </dl> 
    <p><input type=submit value=Register> 
</form> 

В результате он образует последовательность из них:

<dt><label for="email">Email Address</label> 
<dd><input id="email" name="email" type="text" value=""> 

Я хочу поставить больше параметров и в несколько иной манере, как:

 <input type="email" id="email" name="email" class="input-xlarge" 
     placeholder="Email Address" value="{{ form.email }}" 
     required> 

Как изменить

<dt>{{ field.label }} 
    <dd>{{ field(**kwargs)|safe }} 

для достижения этой цели?

+0

Как ваше название относится к вопросу? –

+0

Хорошо заметили, исправили. – Ivegotaquestion

+0

[полевая документация] (http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.Field.__call__) вы можете сделать 'form.email (style =" style ")' im не уверен, что он будет передавать атрибуты html. Я тоже помню эту проблему. Но с тех пор изменился код –

ответ

2

Исходя из documentation вы можете сделать:

{{ form.email(class_="input-xlarge", 
       placeholder="Email Address", 
       value="[email protected]") }} 

Который воздаст:

<input type="email" id="email" name="email" class="input-xlarge" 
 
     placeholder="Email Address" value="[email protected]" 
 
     required>

Просто замените "[email protected]" с form.email без скобки, поскольку вы уже находитесь внутри них.

+0

Спасибо, но это не сработало: Файл «/app/templates/register.html», строка 53, в блоке «content» {{render_field (form.email (class _ = "input-xlarge ", placeholder =" Адрес электронной почты ", value =" [email protected] "))}} Файл" /app/templates/_formhelpers.html ", строка 3, в шаблоне

{{поле (** kwargs) | safe}} AttributeError: объект HTMLString не имеет атрибута '__ call __' – Ivegotaquestion

+0

Вы не можете передать его в render_field. Вам необходимо изменить код, чтобы render_field только отображал ошибки. Если вы не только обновляете информацию, которая может быть сделана родовой, как класс. Тогда вы можете изменить render_field, чтобы иметь '

{{поле (класс _ =" класс, который вы хотите ", ** kwargs) | safe}}' –

+0

Думаю, я понимаю, что вы имеете в виду. Но как я могу добавить класс в __some__ полей в _formhelpers.html, а не для __all__ из них в _formhelpers.html? – Ivegotaquestion