gpt4 book ai didi

javascript - Flask WTForms 的自定义属性

转载 作者:太空狗 更新时间:2023-10-29 19:33:43 32 4
gpt4 key购买 nike

我在 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 _- 用于 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 class you attach to your form实际上被要求使用 Meta.render_field() hook 渲染字段:

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- 开头的关键字参数,确保可以添加正确的 HTML 属性。 AngularJSMixin 可以与任何小部件类一起使用。

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

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

在渲染模板时,您可以再次使用 ng_model:

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

在所有情况下,属性将作为 placeholder="Name"ng-model="NameModel" 添加到呈现的 HTML 中:

<input id="name" name="name" ng-model="NameModel" placeholder="Name" type="text" value="">

关于javascript - Flask WTForms 的自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440056/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com