繁体   English   中英

Flask WTForms 的自定义属性

[英]Custom attributes for Flask WTForms

我在 Flask 和 AngularJS 上开发网站。 我需要使用 AngularJS 发送带有 AJAX 的表单,但它需要输入字段的自定义属性。 例如我在 Jinja2 模板中有一个表单:

<form method="post" action="/">
    {{ form.hidden_tag() }}
    {{ form.name(placeholder="Name") }}
</form>

那么如何从 AngularJS 添加一个属性,让我为我的“名称”字段说“ng-model”?

感谢您的帮助!

Python 标识符中不允许使用破折号,并且只有 Python 标识符可以用作调用中的keyword_argument=value对。

但是你有几个选项可以解决这个问题; 您可以在**kwargs映射中传入ng-前缀选项,将用于表单的Meta类转换为_ to -用于ng_属性,或使用自定义小部件进行相同的转换。

传入 **kwargs 映射

使用**kwargs您可以传入不是 Python 标识符的参数,只要它们是字符串即可。 使用它来呈现您的表单字段:

{{ form.name(placeholder="Name", **{'ng-model': 'NameModel'}) }}

您可以在字段定义的render_kw映射中放置相同的信息:

class MyForm(Form):
    name = StringField(u'Full Name', render_kw={'ng-model': 'NameModel'})

每次渲染字段时都会使用它; render_kw被添加到渲染时传入的任何参数中,因此:

{{ form.name(placeholder="Name") }}

将呈现placeholderng-model属性。

子类 Meta 并在您的表单中使用它

从 WTForm 2.0 开始,您附加到表单Meta实际上被要求使用Meta.render_field()钩子呈现字段:

import wtform.meta

class AngularJSMeta:
    def render_field(self, field, render_kw):
        ng_keys = [key for key in render_kw if key.startswith('ng_')]
        for key in ng_keys:
            render_kw['ng-' + key[3:]] = render_kw.pop(key)
        # WTForm dynamically constructs a Meta class from all Meta's on the
        # form MRO, so we can use super() here:
        return super(AngularJSMeta, self).render_field(field, render_kw)

要么直接在您的表单上使用它:

class MyForm(Form):
    Meta = AngularJSMeta

    name = StringField(u'Full Name')

或子类化Form类:

class BaseAngularJSForm(Form):
    Meta = AngularJSMeta

并将其用作所有表单的基础:

class MyForm(BaseAngularJSForm):
    name = StringField(u'Full Name')

现在您可以使用这是您的模板:

{{ form.name(placeholder="Name", ng_model='NameModel') }}

子类小部件

您可以使用以下方法对您选择的小部件进行子类化:

class AngularJSMixin(object):
    def __call__(self, field, **kwargs):
        for key in list(kwargs):
            if key.startswith('ng_'):
                kwargs['ng-' + key[3:]] = kwargs.pop(key)
        return super(AngularJSMixin, self).__call__(field, **kwargs)

class AngularJSTextInput(AngularJSMixin, TextInput):
    pass

ng_任何以ng_的关键字参数ng_为以ng_的关键字参数, ng-确保可以添加正确的 HTML 属性。 AngularJSMixin可以与任何小部件类一起使用。

将此用作您字段上的widget属性:

class MyForm(Form):
    name = StringField(u'Full Name', widget=AngularJSTextInput())

同样,您可以在渲染模板时使用ng_model

{{ form.name(placeholder="Name", ng_model='NameModel') }}

在所有情况下,属性将在渲染的 HTML 中添加为placeholder="Name" ng-model="NameModel"

<input id="name" name="name" ng-model="NameModel" placeholder="Name" type="text" value="">
{{ form.username(placeholder='your name', size=20, **{'ng-model':'hello', 'class':'hello'}) }}

我认为更好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM