【问题标题】:Determining if a simple_form object has been submitted yet确定是否已提交 simple_form 对象
【发布时间】:2012-03-15 09:57:13
【问题描述】:

我正在使用 pyramid_simpleform 构建一个 Form 对象。我想要一种构建表单对象的方法,一旦提交它就会尝试验证它。

如果输入有效,我会将用户重定向到确认页面。否则,我将呈现一个错误页面。我正在使用 form.validate() 来查看输入数据是否符合架构。

如果表单尚未提交,我想使用 render_to_response 显示表单。如何检测表单是否已提交?

【问题讨论】:

    标签: python pyramid simple-form


    【解决方案1】:

    快速解答

    就像 Furbeenator 回答的那样:

    if request.method == "POST":
    

    长答案

    您应该将逻辑拆分为两个不同的视图函数。

    此外,您应该返回一个表单渲染器以供您的模板使用,而不是直接在视图函数中渲染表单。例如:

    ./forms.py:

    from formencode import Schema, validators
    
    class RegistrationForm(Schema):
        email = validators.Email(not_empty=True, strip=True)
        password = validators.UnicodeString(not_empty=True)
        password_confirm = validators.UnicodeString()
        chained_validators = [validators.FieldsMatch(
                        'password', 'password_confirm',
                        messages=dict(invalidNoMatch=u'Password does not match'))]
    

    ./views/accounts.py:

    from pyramid_simpleform import Form
    from pyramid_simpleform.renderers import FormRenderer
    from pyramid.view import view_config
    from pyramid.httpexceptions import HTTPFound
    from pyramid.url import route_url
    from ..forms import RegistrationForm
    from ..models import DBSession, User
    
    @view_config(route_name='accounts_register', renderer='/accounts/register.mako',
                request_method='GET')
    def register(request):
        """Shows the empty form."""
        form = Form(request, schema=RegistrationForm)
        return {'renderer': FormRenderer(form)}
    
    @view_config(route_name='accounts_register', renderer='/accounts/register.mako',
                request_method='POST')
    def register_post(request):
        """Receives the posted form."""
        form = Form(request, schema=RegistrationForm)
        if form.validate():
            user = User(form.data['email'], form.data['password'])
            DBSession.add(user)
            return HTTPFound(route_url('profile', request))
        return {'renderer': FormRenderer(form)}
    

    ./templates/accounts/register.mako:

    <form action="" method="post">
      <div class="${' error' if renderer.is_error('email') else ''}">
        <label for="email">Email</label>
        ${renderer.text('email', type='email', placeholder='Email')}
        % if renderer.is_error('email'):
          <span class="errors">${', '.join(renderer.errors_for('email'))}</span>
        % endif
      </div>    
      <!-- ... --->
    </form>
    

    【讨论】:

      【解决方案2】:

      如果你有请求对象,你可以测试它的“POST”方法。

      if request.method == "POST":
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多