2015-03-03 5 views
3

Я работаю над расширением webapp, с которым мы закончили после завершения официального учебника Django.Перенаправление после сохранения формы на Django

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

Я борюсь с получением страницы для обработки данных, а затем перенаправляется на индексную страницу ('/ polls').

Когда я отправляю новый опрос в качестве зарегистрированного пользователя, я возвращаюсь на свою индексную страницу, которая должна показывать самые последние опубликованные опросы или в случае отсутствия опросов, сообщение «Нет опросов». "

По какой-то причине я всегда вижу «Нет опросов», но как только я нажимаю на индексную страницу по ссылке на сайте, она отображает все мои опросы, включая мой последний созданный, данные нетронутыми!

Любые мысли здесь? Я думаю, что я включил соответствующую информацию ниже, но счастлив предоставить больше. Заранее благодарим за любую помощь/совет.

views.py

class IndexView(generic.ListView): 
    template_name = 'polls/index.html' 
    context_object_name = 'latest_question_list' 

    def get_queryset(self): 
     """Return the last five published questions.""" 
     return Poll.objects.order_by('-pub_date')[:15] 

@login_required 
def add_poll(request): 
    ChoiceFormSet = formset_factory(ChoiceForm, extra=3, min_num=2, validate_min=2) 

    if request.method == 'POST': 
     form = PollForm(request.POST) 
     formset = ChoiceFormSet(request.POST) 
     if all([form.is_valid(), formset.is_valid()]): 
      poll = form.save() 
      for inline_form in formset: 
       if inline_form.cleaned_data: 
        choice = inline_form.save(commit=False) 
        choice.question = poll 
        choice.save() 
      return render(request, 'polls/index.html', {}) 
    else: 
     form = PollForm() 
     formset = ChoiceFormSet() 

    return render(request, 'polls/add_poll.html', {'form': form, 'formset': formset}) 

add_poll.html

{% extends 'polls/base.html' %} 

{% block title %}Add Poll{% endblock %} 

{% block body_block %} 
<form role="form" id="poll_form" method="post" action="{% url 'polls:add_poll' %}"> 
<h2 class="form-signin-heading">Add a Poll</h2> 

    {% csrf_token %} 

    <table> 
    {{ form }} 
    {{ formset }} 
    </table> 

<br/> 

<button class="btn btn-primary" type="submit" name="submit">Create Poll</button> 

</form> 

{% endblock %} 

index.html

{% extends 'polls/base.html' %} 

{% block body_block %} 
{% if latest_question_list %} 
<ul> 
    {% for poll in latest_question_list %} 
    <li><a href="{% url 'polls:detail' poll.id %}">{{ poll.question_text }}</a></li> 
    {% endfor %} 
</ul> 
{% else %} 
<p>No polls are available.</p> 
{% endif %} 
{% endblock %} 

urls.py

from django.conf.urls import patterns, url 

from . import views 

urlpatterns = patterns('', 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'), 
    url(r'^(?P<pk>\d+)/results/$', views.ResultsView.as_view(), name='results'), 
    url(r'^add_poll/$', views.add_poll, name='add_poll'), 
    url(r'^(?P<question_id>\d+)/vote/$', views.vote, name='vote'), 
    url(r'^profile_page/$', views.ProfileView.as_view(), name='profile_page'), 
    url(r'^edit_profile/$', views.edit_profile, name='edit_profile'), 
) 

ответ

4

При сохранении формы вы не перенаправление. Вы возвращаете 'polls/index.html' с пустыми данными polls, поэтому вы всегда получаете «Нет опросов». Таким образом, вместо этого:

return render(request, 'polls/index.html', {}) 

попробовать это:

return HttpResponseRedirect(reverse('polls:index')) 
+0

Благодаря Тодор, это имеет смысл. Пропустит ли контекст, содержащий список опросов вместо {} в исходной функции рендеринга, также выполнить работу в такой ситуации? – ploo

+2

Да, возможно, это сработает. Однако вы не должны этого делать *. Вы должны * всегда * перенаправлять после POST. – Serafeim

+0

Я согласен с @Serafeim, он будет работать, но не делайте этого. – Todor

1

Вы не переадресовываете прямо сейчас, вы просто показываете свой индексный шаблон с пустым контекстом (вот почему вы ничего не видите). Для перенаправления вам нужно использовать HttpResponseRedirect, когда ваша форма действительна.

Так, пожалуйста, измените строку:

 
return render(request, 'polls/index.html', {}) 

(как раз над else) в

 
return HttpResponseRedirect(reverse('index')) 
Смежные вопросы