Лучший способ передачи параметров формы в скрытую форму в пирамиде - PullRequest
1 голос
/ 08 декабря 2011

В предыдущем вопросе я пытался найти правильную стратегию для передачи данных между формами в пирамиде. Основываясь на полученном ответе, я решил использовать скрытую форму.

Я начал реализовывать это и думаю, что должен быть лучший способ передачи данных. В частности, передача параметров через url приводит к кортежу, который разбирается беспорядочно.

Я хочу, чтобы он был достаточно общим, чтобы не знать, какие параметры имеет форма, а также для обработки полей файла.

Как я сейчас пытаюсь передать данные формы на страницу подтверждения:

@view_config(renderer="templates/derived/load/error.mak", route_name='process_model_route')
def process_model(self):
    #processing logic and validaton, failiure in validation sends user to error.mak
    return HTTPFound(route_url('confirm_model_route', self.request, fparams=self.request.POST))

Маршрут: config.add_route('confirm_model_route', 'rnd2/model/confirm/*fparams')

@view_config(renderer="templates/derived/confirm/model.mak", route_name='confirm_model_route')
def confirm_model(self):
    form_dict = self.request.matchdict['fparams']
     #need to decode and pass to template
     return dict({'load_route':load_route, 'form_dict':form_dict})

Шаблон подтверждения / model.mak будет содержать скрытую форму.

1 Ответ

4 голосов
/ 08 декабря 2011

Идея с этим методом:

  1. Страница посещений клиента.
  2. Сервер отображает форму.
  3. Клиент заполняет форму и отправляет на URL.
  4. Сервер отображает новую страницу, содержащую скрытую форму со всеми данными, которые он только что получил в POST.
  5. Клиент отправляет на URL-адрес, подтверждающий отправку.
  6. Сервер сохраняет данные из скрытой формы и перенаправляет.

Теперь, в зависимости от юзабилити, вы сами решаете, сколько разных URL вам действительно нужно и сколько просмотров в Пирамиде. Вы должны подумать о том, что происходит с неверными данными?

Обратите внимание, что, как только пользователь отправит форму URL-адресу, этот URL-адрес должен вернуть страницу подтверждения, содержащую скрытую форму. Если вместо этого вы попытаетесь перенаправить пользователя на страницу подтверждения, вы должны каким-либо образом сохранить данные, либо в сеансе, либо с помощью хака, который вы показали в своем примере (запихивая все данные в GET). Второе решение очень плохое, потому что оно злоупотребляет истинным назначением GET в HTTP.

Существует также соглашение, согласно которому каждый POST должен приводить к перенаправлению, чтобы клиент не отправлял форму несколько раз. Имея это в виду, вы могли бы рассмотреть простое решение отклонения POST, у которых нет флага «подтверждено», и просто установить флаг «подтверждено» в javascript после запроса пользователя. Это позволяет вам сохранять логику обработки форм простой.

Если вы не хотите полагаться на javascript и , вы не хотите сохранять данные формы в сеансе, тогда вы столкнетесь с проблемой не перенаправления после первого POST, но иного, чем что это должно быть просто из схемы выше.

...