首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django上保存表单后重定向

在Django上保存表单后重定向
EN

Stack Overflow用户
提问于 2015-03-04 04:38:26
回答 2查看 12.6K关注 0票数 6

我正在扩展我们在完成官方Django教程后留下的webapp。

我希望添加的功能之一是为用户添加投票自己的能力。

我正在努力让页面处理数据,然后重定向到索引页面('/polls')。

当我以登录用户的身份提交新的投票时,我会返回到我的索引页面,该页面应该显示最近发布的投票,或者在没有投票的情况下,显示消息"No polls are available“。

由于某些原因,我总是看到“没有可用的投票”,但是一旦我通过网站上的一个链接点击到索引页面,它就会显示我所有的投票,包括我最近创建的一个,数据完好无损!

有什么想法吗?我想我已经包含了下面的相关信息,但我很乐意提供更多。提前感谢您的帮助/建议。

views.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
{% 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

代码语言:javascript
运行
复制
{% 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

代码语言:javascript
运行
复制
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'),
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-04 04:48:44

当您保存表单时,您不会重定向。

您返回的是带有空polls数据的'polls/index.html',这就是为什么您总是得到“没有可用的轮询”的原因。但这是非常不正确的,您必须遵循Post/Redirect/Get (PRG)模式,所以不是:

代码语言:javascript
运行
复制
return render(request, 'polls/index.html', {})

执行以下操作:

代码语言:javascript
运行
复制
return HttpResponseRedirect(reverse('polls:index'))
票数 10
EN

Stack Overflow用户

发布于 2018-12-24 20:24:38

我终于想通了。我不得不将我的html表单更改为:

代码语言:javascript
运行
复制
<form method="POST" action="{% url 'new_beam:beam_diagram' beam_id=1 %}" enctype="multipart/form-data">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28841447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档