跳转到主要内容

使在TurboGears2中创建AJAX表单更加容易

项目描述

关于Ajax表单

tgext.ajaxforms使得在TurboGears2应用中快速轻松地创建AJAX加载和提交的表单变得容易。

要使表单基于AJAX,只需将ajaxforms.ajaxloaded装饰器应用到任何ToscaWidgets表单上,并声明一个ajaxurl变量来指定加载表单的方法。该方法可以是自动生成的或手写的。默认情况下,自动支持AJAX验证。

安装

tgext.ajaxform可以从PyPI或从Bitbucket安装

easy_install tgext.ajaxforms

应该对大多数用户来说都可以正常工作

创建AJAX表单

表单本身可以是任何ToscaWidgets表单,唯一需要添加的是将@ajaxloaded装饰器应用到表单本身上,并指定指向相关控制器方法的表单的ajaxurl

from tgext.ajaxforms import ajaxloaded

@ajaxloaded
class TestForm(twf.TableForm):
    class fields(WidgetsList):
        name = twf.TextField('Name', validator=validators.String(not_empty=True))
        surname = twf.TextField('Surname', validator=validators.String(not_empty=True))

    ajaxurl = '/form_show'
    action = '/form_submit'
    submit_text = "GO"
test_form = TestForm()

显示表单

要显示表单,需要在绑定到表单的ajaxurl参数的控制器方法中添加一个方法,该方法将显示表单本身,并在每次ajaxform需要显示表单时使用。对于大多数情况,可以使用ajaxform调用生成该方法。同时,您还需要创建一个页面,表单将在其中加载。

例如,要在首页中显示表单,且ajaxurl = '/form_show'

from tgext.ajaxforms import ajaxform

class RootController(BaseController):
    form_show = ajaxform(test_form)

    @expose('myapp.templates.index')
    def index(self):
        return dict(form=test_form)

myapp.templates.index模板应看起来像您通常用于显示基于ToscaWidgets的表单的模板

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="master.html" />
    <head>
        <meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/>
        <title>Ajax Form Test Example</title>
    </head>
    <body>
        <div id="myform">
           ${form(name='HI')}
        </div>
    </body>
</html>

处理提交和验证

提交和验证应该与您用于任何ToscaWidgets表单的方式相同,只需使用绑定到ajaurl的方法作为错误处理器即可

class RootController(BaseController):
    @expose()
    @validate(test_form, error_handler=form_show)
    def form_submit(self, **kw):
        return 'Thanks: {name} {surname}'.format(**kw)

完整示例

myapp.templates.index

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="master.html" />
    <head>
        <meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/>
        <title>Ajax Form Test Example</title>
    </head>
    <body>
        <div id="myform">
           ${form(name='HI')}
        </div>
    </body>
</html>

myapp.controllers.root

from tgext.ajaxforms import ajaxloaded, ajaxform

@ajaxloaded
class TestForm(twf.TableForm):
    class fields(WidgetsList):
        name = twf.TextField('Name', validator=validators.String(not_empty=True))
        surname = twf.TextField('Surname', validator=validators.String(not_empty=True))

    ajaxurl = '/form_show'
    action = '/form_submit'
    submit_text = "GO"
test_form = TestForm()

class RootController(BaseController):
    form_show = ajaxform(test_form)

    @expose('myapp.templates.index')
    def index(self):
        return dict(form=test_form)

    @expose()
    @validate(test_form, error_handler=form_show)
    def form_submit(self, **kw):
        return 'Thanks: {name} {surname}'.format(**kw)

按需显示表单

AjaxForm自0.1.2版本开始支持按需显示表单。这允许在JavaScript事件发生时显示表单。

要实现这一功能,您必须在模板内部显示表单时使用 form.on_demand() 而不是 form()。这将创建一个名为 FormClassName_on_demand(where, params) 的javascript函数,其中 where 参数是任何有效的选择器,用于显示表单,而 params 方法是一个字典,包含了需要发送到后端的参数。默认情况下,params 字典中指定的任何参数都将用于填充表单字段。

例如,要按需显示此表单

@ajaxloaded
class TryAjax(TableForm):
    class fields(WidgetsList):
        field1 = TextField(validator=validators.String(not_empty=True))
        field2 = TextField(validator=validators.String(not_empty=True))
    action = '/dosomething'
    ajaxurl = '/TryAjax_show'
ajax_test = TryAjax()

您的模板可能看起来像这样

<div id="myform_box">
    ${form.on_demand()}
    <div onclick="TryAjax_on_demand('#myform_box', {'field2':'random text'})">Show Form</div>
</div>

项目详细信息


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

tgext.ajaxforms-0.3.2.tar.gz (52.7 kB 查看哈希值)

上传时间

支持