Вы спрашиваете не «Как перенаправить», а «Как изменить рендерер в функции просмотра». Чтобы ответить быстро, я думаю, вы могли бы использовать:
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
- Если данные недействительны, вы возвращаете запрос на повторное отображение формы с ошибками на этот раз
- Вы используете один и тот же рендерер в
GET
и POST
, но тот, что в POST
, используется только в случае неверных данных (в противном случае вы перенаправляете).
- У вас есть другая функция просмотра, чтобы показать созданную модель.