Python: WTForms Can I add a placeholder attribute when initializing a field?

I want to add the placeholder attribute to a field in WTForms. How can i do this?

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

The above code is invalid

How to add placeholder attribute with value?

+48
python wtforms
Mar 17 2018-12-12T00:
source share
3 answers

Updated for WTForms 2.1

Now that WTForms 2.1 (December 2015) sets rendering keywords using the render_kw= parameter for the field constructor.

So the field will look like this:

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

Please note that this is possible; he begins to bridge the line between code and presentation; so use it wisely!




(Old answer, still true for versions older than WTForms 2.1)

placeholder not supported in the Python constructor in WTforms 2.0.x and below.

However, you can do this easily in your template:

 {{ form.abc(placeholder="test") }} 
+75
Mar 20 2018-12-12T00:
source share

The correct answer is as follows:

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

As you can read in the documentation:

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

Then in your template:

 {% import 'forms.html' as forms %} {% for field in form %} {{ forms.render_field(field) }} {% endfor %} 

Where render_field is the macro that is defined in 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 %} 
+7
Apr 21 '15 at 13:15
source share

My solution uses a custom widget:

 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')) 

It may not be ellegant, but it allows you to use Flask-Bootstrap and define your forms in the form code, not in the template

+1
Oct 02 '15 at 15:06
source share



All Articles