2014-03-04 3 views
7

Я делаю Танго с Django учебник и я закончил учебники успешно, однако я заметил в официальном Джанго Опросы учебнике следующее:Должен ли я использовать HttpResponseRedirect здесь?

def vote(request, question_id): 
p = get_object_or_404(Question, pk=question_id) 
try: 
    selected_choice = p.choice_set.get(pk=request.POST['choice']) 
except (KeyError, Choice.DoesNotExist): 
    # Redisplay the question voting form. 
    return render(request, 'polls/detail.html', { 
     'question': p, 
     'error_message': "You didn't select a choice.", 
    }) 
else: 
    selected_choice.votes += 1 
    selected_choice.save() 
    # Always return an HttpResponseRedirect after successfully dealing 
    # with POST data. This prevents data from being posted twice if a 
    # user hits the Back button. 
    return HttpResponseRedirect(reverse('polls:results', args=(p.id,))) 

деталь, чтобы заметить здесь «Всегда возвращать HttpResponseRedirect после успешно работая с данными POST ». Однако, в танго с Джанго учебника:

def add_page(request, category_name_url): 
context = RequestContext(request) 

category_name = decode_url(category_name_url) 

if request.method == 'POST': 
    form = PageForm(request.POST) 

    if form.is_valid(): 
     page = form.save(commit=False) 

     try: 
      cat = Category.objects.get(name=category_name) 
      page.category = cat 
     except Category.DoesNotExist: 
      return render_to_response('rango/add_category.html', {}, context) 

     page.views = 0 
     page.save() 

     return category(request, category_name_url) 
    else: 
     print(form.errors) 
else: 
    form = PageForm() 

return render_to_response('rango/add_page.html', 
         {'category_name_url': category_name_url, 
          'category_name' : category_name, 
          'form'    : form}, context) 

Обратите внимание на отсутствие HttpResponseRedirect несмотря на использование данных POST. Я не знаю, правильно это или нет?

Я смотрел здесь: Django HttpResponseRedirect

Здесь: Django: HttpResponseRedirect not working

И здесь: Django HttpResponseRedirect vs render_to_response - how to get a login form to behave the way I need it to

Кроме того, здесь: Django form redirect using HttpResponseRedirect

И, наконец, здесь: Django: What is the difference b/w HttpResponse vs HttpResponseRedirect vs render_to_response

Я до сих пор не совсем понимаю, как использовать HttpResponseRedirect. Пожалуйста помоги.

Заранее благодарим всех, кто отвечает.

+1

+1 потому что вы провели очень тщательное исследование. :) –

+1

Да, TWD недвусмысленно неправильно здесь. Кто-нибудь знает, принимают ли они патчи? –

+0

@BlueIce Я научился исследовать перед публикацией. Я не новичок в форумах, новых для SO, и я приношу свои извинения за то, что вы не ответили раньше. Я полагал, что никто не отвечал на мой вопрос, потому что я не получал и не писал по электронной почте или что-то еще. Спасибо за все замечательные ответы. Я не знаю, принимают ли они патчи. Я поднял вопрос. Здесь: https://github.com/leifos/tango_with_django/issues/16 –

ответ

2

Общепринятой практикой является предотвращение повторной отправки пользователем формы после того, как начальный запрос POST был обработан на стороне сервера.

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

+0

Я должен согласиться с вами здесь. Просто я новичок в Django и все еще пытаюсь учиться. Я сделал официальный учебник и прочитал «Два совок», и они также рекомендовали это. Я поймал и другие вещи в его учебнике, как, например, жестко закодированные URL-адреса. По моему мнению, это ужасная практика. В целом, я думаю, что TWD хорош, просто не завершен. Это позволяет кому-то видеть создание веб-сайта от начала до конца, не является распространенным среди онлайн-руководств. –

+1

Ничего плохого в задании вопросов, если вы не уверены - с удовольствием помогите – dannymilsom

0

Обратите внимание на отсутствие HttpResponseRedirect, несмотря на использование данных POST. Я не знаю, правильно это или нет?

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

+1

Да, так я понял это из учебника. Благодарю. –

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