Development Tip

Python : WTForms 필드를 초기화 할 때 자리 표시 자 속성을 추가 할 수 있습니까?

yourdevel 2020. 12. 29. 08:00
반응형

Python : WTForms 필드를 초기화 할 때 자리 표시 자 속성을 추가 할 수 있습니까?


WTForms의 필드에 자리 표시 자 속성을 추가하고 싶습니다. 내가 어떻게 해?

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

위 코드는 유효하지 않습니다

값이있는 자리 표시 자 속성을 추가하려면 어떻게해야합니까?


WTForms 2.1 업데이트

이제 WTForms 2.1 (2015 년 12 월) render_kw=부터 필드 생성자에 매개 변수를 사용하여 렌더링 키워드를 설정할 수 있습니다.

따라서 필드는 다음과 같습니다.

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

이것이 가능하지만 유의하십시오. 코드와 프리젠 테이션 사이의 경계를 연결하기 시작합니다. 그래서 현명하게 사용하십시오!


(이전 답변, WTForms 2.1 이전 버전의 경우 여전히 적용됨)

placeholder WTforms 2.0.x 이하의 Python 생성자에서는 지원되지 않습니다.

그러나 템플릿에서 쉽게 수행 할 수 있습니다.

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

정답은 다음과 같습니다.

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

문서에서 읽을 수 있듯이 :

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

그런 다음 템플릿에서 :

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

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

여기서 render_field는 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 %}

My solution is use 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'))

Maybe it's not ellegant, but it allows to use Flask-Bootstrap and define your forms in the forms code, not in the template

ReferenceURL : https://stackoverflow.com/questions/9749742/python-wtforms-can-i-add-a-placeholder-attribute-when-i-init-a-field

반응형