2011-11-30 58 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'