金字塔:使用表单数据进行路由匹配和POST同时进行

时间:2014-11-05 00:12:08

标签: python jinja2 pyramid

我使用Pyramid构建了一个webapp,我有两个观点,其中一个导向另一个:

config.add_route("new", "/workflow/new")
config.add_route("next", "/workflow/{id}/next")

new视图非常简单,只显示一个HTML表单作为Jinja2 template,供用户填写一些信息:

<form method="post" action="{{ request.route_url('next',id='') }}" >
  <input type="text" name="id" value="Identifier" />
  ...
  <input type="submit" name="next" value="Next" />
</form>

这里的问题涉及该表单的action:如何使用文本输入字段id的内容,或者稍微处理它,然后在路由请求中传递它?

请注意,在此方案中,表单数据从new视图传递到next视图,并且应该保持不变。

1 个答案:

答案 0 :(得分:0)

发布表单后,表单字段将在请求对象中可用,请参阅 http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/webob.html#request

我认为发布到相同的网址(<form action="#" method="post">)也是一个好主意,这样您就可以验证表单。然后,您可以在表单有效时处理并重定向到下一个URL,或者如果不是,则重新创建包含错误的表单。

所以你的观点可能最终会像这样;

from pyramid.httpexceptions import HTTPFound
from pyramid.url import route_url

def myview(request):

    if request.method == 'POST':
        # Validate the form data
        if <form validates successfully>:
            # Do any processing and saving here.
            return HTTPFound(location = route_url('next', id=request.params['id'], request=self.request))
        else:
            request.session.flash("The form isn't valid.")

    # Do some stuff here to re-populate your form with the request.params

    return { # globals for rendering your form }

已经有很多问题/答案可以解决这个问题,例如How can I redirect after POST in Pyramid?