2010-12-10 2 views
1

Я видел образцы Django, и я вижу, что у них хорошая обработка ошибок. Однако я хочу посмотреть, есть ли еще лучший подход, общий шаблон для обработки ошибок проверки формы в Django. Это пример я нашел here:Как написать хорошую проверку формы в Django?

def contact(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = ContactForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      # Process the data in form.cleaned_data 
      # ... 
      return HttpResponseRedirect('/thanks/') # Redirect after POST 
    else: 
     form = ContactForm() # An unbound form 

    return render_to_response('contact.html', { 
     'form': form, 
    }) 

В частности, мне было интересно:

  1. Как может посмотреть в «/ спасибо /» убедитесь, что форма была утверждена? Существуют ли какие-либо общие способы передачи успешной проверки формы на следующий вид? Или мне нужно сделать что-то вручную, например, установить флажок в сеансе запроса?

  2. Как написать этот код таким образом, чтобы форма была недействительной и страница показывалась с ошибками при отправке, если пользователь обновляет браузер, он не будет спрашивать пользователя, хотят ли они снова получать данные POST?

EDIT: Что касается # 1, я имею в виду случаи, как пользователь вручную введя «/ спасибо /» URL или идти вперед и назад по страницам истории и случайно открывающимся без какой-либо формы проверяемых. (Мы все еще показываем страницу «спасибо» или нам нужно как-то повторить проверку, почему мы с благодарностью смотрим).

ответ

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

  2. Если страница генерируется через запрос сообщению браузер всегда будет спрашивать вы, когда нажимаете обновить ... Я предполагаю, что единственный способ избежать этого - перенаправить на другую страницу!

+0

1. Я просил, чтобы такие случаи, как пользователь, вручную вводили URL-адрес/thanks/'или возвращались назад и вперед по страницам истории и случайно открывали его без проверки какой-либо формы. (Мы все еще показываем страницу «спасибо», или нам нужно как-то повторить проверку, почему мы находимся в благодарственном представлении) – aligf

+0

2. Мне было интересно, есть ли способ перенаправить на тот же взгляд, но все еще есть почтовые запросы? Может быть, мне нужно использовать сеанс запроса? – aligf

+0

Если вы перенаправляете, вы теряете данные, хранящиеся в 'request', поэтому для этого вам нужно будет использовать сеанс.Вероятно, вам не нужно было бы создавать другое представление, вы также могли бы отобразить шаблон в своем виде и вернуть его туда ... Хотя я думаю, что вы пытаетесь быть немного более осторожным, чем необходимо, до тех пор, пока вы избегая данных формы, которые хранятся дважды в базе данных и аналогичные вещи, которые пользователь не может действительно «уничтожить» что-либо ... –

1

Как можно посмотреть в «/ спасибо /» убедитесь, что форма была утверждена?

form.is_valid() должен тщательно проверять любое поле или - при необходимости - любую комбинацию, форму и т. Д. Это в основном это. Взгляды знает, форма была действительна если она делает. Нет необходимости включать избыточную информацию в сеанс.

Как написать этот код таким образом, чтобы форма была недействительной и страница показывалась с ошибками при отправке, если пользователь обновляет браузер, он не будет запрашивать у пользователя, хотят ли они снова получать POST-данные ?

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

+0

Что касается №1, см. мои вопросы. Что касается перенаправления с исходного вида, мне нужно сохранить значения запроса POST в сеансе, чтобы иметь возможность делать разметку ошибок? Есть ли какой-либо обычный способ имитировать запрос POST с помощью HttpResponseRedirect? – aligf

Смежные вопросы