[英]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
您可以传入不是 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") }}
将呈现placeholder
和ng-model
属性。
从 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.