sut*_*tee 1 python redirect view pyramid
我正在寻找一种方法将用户重定向到与使用@view_config兼容的不同路由/模板.
我有一个函数读取上传的文件,并尝试根据文件内容创建一个新模型.我想知道是否有一种干净的方式可以将用户重定向到两个网址之一,具体取决于新模型的创建是成功还是存在错误.
如果模型创建成功,我想将用户重定向到模型页面.如果出现错误,我想将用户重定向到错误页面.但是,在呈现错误页面时,我无法分解原始函数(load_model)的view_config.
@view_config(renderer="error.mak")
@view_config(renderer="model.mak",
route_name='load_model_route')
def load_model(self):
...
model = Model.find_model(model_name)
if model:
#redirect to model_route
else:
#redirect to model_error_route
Run Code Online (Sandbox Code Playgroud)
每个路由都有一个@view_config,它将它绑定到一个函数.
您要问的不是"如何重定向",而是"如何在视图功能中更改渲染器".要快速回答,我想你可以使用:
request.override_renderer = 'other-renderer.mak'
Run Code Online (Sandbox Code Playgroud)
但我认为这不是一个好主意.以下是大多数时间用于处理表单提交的常用模式:
from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.url import route_url
from your_app import Model, some_stuff, save_to_db
@view_config(route_name='new_model',
renderer='model/new.mak', request_method='GET')
def new(request):
"""Shows the empty form."""
return {'model': Model(), 'errors': {}}
@view_config(route_name='create_model',
renderer='model/new.mak', request_method='POST')
def create(request):
"""Receives submitted form."""
model = some_stuff()
if len(model.errors) = 0: # is valid
# do your stuff, then redirect
save_to_db(model)
return HTTPFound(route_url('show_model', request, model_id=model.id))
# is invalid
return {'model': model, 'errors': model.errors}
@view_config(route_name='show_model',
renderer='model/show.mak', request_method='GET')
def show(request):
"""Shows details of one model."""
model = Model.find(request.matchdict['model_id'])
if model is None:
return HTTPNotFound()
return {'model': model}
Run Code Online (Sandbox Code Playgroud)
简而言之:
GET一个新模型的路线时,你会显示一个空表格.POST在不同的视图函数中处理表单提交()
GET和中使用相同的渲染器POST,但是POST仅在无效数据的情况下使用该渲染器(否则,您重定向).