2011-11-30 59 views
1

我正在寻找一种方法将用户重定向到与使用@view_config兼容的不同路由/模板。金字塔中的条件重定向

我有一个函数读取上传的文件,并尝试根据文件内容创建一个新的模型。我想知道是否有一种干净的方式,可以根据新模型的创建是否成功或出现错误,将用户重定向到两个URL之一。

如果模型创建成功,我想将用户重定向到模型页面。如果出现错误,我想将用户重定向到错误页面。但是,在渲染错误页面时,无法突破原始函数(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 

每条路径都有一个@view_config,它将它绑定到一个函数。

回答

5

你在问什么不是“如何重定向”,而是“如何在视图函数中更改渲染器”。要回答很快,我认为你可以使用:

request.override_renderer = 'other-renderer.mak' 

但我不认为这是一个好主意。下面是用得最多的时间来处理表单提交了以往的模式:

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} 

简而言之:

  • 您展示一个空的形式,当你为一个新的模型路线上有GET
  • 您处理在不同的视图功能
    • 形式提交(POST)如果数据是有效的,你做你的东西,那么你与HTTPFound
    • 重定向如果数据是无效的,返回一个字典来再次显示形式,错误此时
  • 可以使用相同的渲染器在GETPOST,而是一个在POST仅在无效数据(否则,您重定向)的情况下使用。
  • 您有另一个视图函数来显示创建的模型。
2

安东尼显示了一个更通用的解决方案,但这里试图坚持您的基本格式。

这个想法是,你想要做一些处理,然后将用户重定向到成功或失败页面。如果您想以与重定向到成功页面的方式相同的方式重定向到失败页面,但我将显示一个不同的版本,您只需在加载时显示错误页面,但如果加载工作,则会重定向到模型。

config.add_route('show_model', '/models/{id}') 
config.add_route('load_model', '/load_model') 

@view_config(route_name='load_model', renderer='error.mak') 
def load_model(self): 
    # ... 
    model = Model.find_model(model_name) 
    if model: 
     return HTTPFound(self.request.route_url('show_model', id=model.id)) 
    return {} # some dict of stuff required to render 'error.mak' 

@view_config(route_name='show_model', renderer='model.mak') 
def show_model(self): 
    id = request.matchdict['id'] 
    model = Model.get_model_by_id(id) 
    # be aware model could fail to load in this new request 
    return {'model': model} # a dict of stuff required to render 'model.mak'