2012-03-17 25 views

Trả lời

77

Cập nhật cho WTForms 2.1

bây giờ như của WTForms 2.1 (tháng 12 năm 2015) Bạn có thể thiết lập render từ khóa bằng cách sử dụng các tham số render_kw= để các nhà xây dựng trường.

Vì vậy, lĩnh vực này sẽ như thế nào:

abc = StringField('abc', [InputRequired()], render_kw={"placeholder": "test"}) 

Lưu ý trong khi điều này là có thể; nó bắt đầu nối đường giữa mã và bản trình bày; vì vậy hãy sử dụng nó một cách khôn ngoan!


(Cũ câu trả lời, vẫn đúng đối với các phiên bản cũ hơn WTForms 2,1)

placeholder không được hỗ trợ trong các nhà xây dựng Python trong WTforms 2.0.x và dưới đây.

Tuy nhiên, bạn có thể làm điều này một cách dễ dàng trong mẫu của bạn:

{{ form.abc(placeholder="test") }} 
+2

u là đúng, trình giữ chỗ phải có kiểu và không được thêm vào các yếu tố cấu trúc. –

+0

Nhưng nếu tôi sử dụng macro và được gọi bên trong một vòng lặp lặp qua các trường biểu mẫu. Làm thế nào tôi có thể kiểm tra bên trong vĩ mô mà một trường có thuộc tính html bổ sung? – Marconi

+10

Trình giữ chỗ giống với nhãn. Đó là, do đó, nội dung và không phải là phong cách. Đặt nó trong một mẫu làm cho nó không thể có các khuôn mẫu chung chung. – Milimetric

7

Câu trả lời đúng là như sau:

abc = TextField('abc', validators=[Required(), Length(min=3, max=30)], description="test") 

Như người ta có thể đọc trong documenatation:

description – A description for the field, typically used for help text. 

Sau đó, trong mẫu của bạn:

{% import 'forms.html' as forms %} 

{% for field in form %} 
    {{ forms.render_field(field) }} 
{% endfor %} 

đâu render_field là một macro được định nghĩa trong forms.html:

{% macro render_field(field) -%} 

{% if field.type == 'CSRFTokenField' %} 
    {{ field }} 

    {% if field.errors %} 
     <div class="warning">You have submitted an invalid CSRF token</div> 
    {% endif %} 
{% elif field.type == 'HiddenField' %} 
    {{ field }} 
{# any other special case you may need #} 
{% else %} 
    <div class="form-group"> 
     <label for="{{ field.label.field_id }}" class="col-sm-2 control-label">{{ field.label.text }}</label> 
     <div class="col-sm-10"> 
      {{ field(placeholder=field.description) }} 
      {% if field.errors %} 
       <div class="alert alert-danger" role="alert"> 
       {% for err in field.errors %} 
        <p>{{ err|e }}</p> 
       {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
    </div> 
{% endif %} 

{%- endmacro %} 
1

Giải pháp của tôi là sử dụng một widget tùy chỉnh:

from flask.ext.wtf import Form 
from wtforms import StringField, validators 
from wtforms.widgets import Input 


class CustomInput(Input): 
    input_type = None 

    def __init__(self, input_type=None, **kwargs): 
     self.params = kwargs 
     super(CustomInput, self).__init__(input_type=input_type) 

    def __call__(self, field, **kwargs): 
     for param, value in self.params.iteritems(): 
      kwargs.setdefault(param, value) 
     return super(CustomInput, self).__call__(field, **kwargs) 


class CustomTextInput(CustomInput): 
    input_type = 'text' 


class EditProfileForm(Form): 
    first_name = StringField('First name', 
          validators=[validators.DataRequired()], 
          widget=CustomTextInput(placeholder='Enter first name')) 

Có lẽ nó không ellegant, nhưng nó cho phép sử dụng Flask -Bootstrap và xác định biểu mẫu của bạn trong mã biểu mẫu, không có trong mẫu

Các vấn đề liên quan