Django重定向回到表单

时间:2015-08-10 01:36:33

标签: python django

我试图将表单帖子重定向回到发布的页面。所以我的应用程序有一个详细信息页面,显示有关地点的信息,/ arena / 123,并且在同一页面上有一个表单,用户可以输入一些关于他们正在查看的当前位置的评论或评级。这些是我的观察功能。

class DetailView(LoginRequiredMixin, generic.DetailView):
    model = Arena
    template_name = 'arenas/detail.html'

    def get_context_data(self, **kwargs):
        context = super(DetailView, self).get_context_data(**kwargs)
        if 'form' not in context:
            print 'no form in context'
            context['form'] = RatingForm
        return context

def rate(request):
    if request.method == 'POST':
        form = RatingForm(request.POST)
        if form.is_valid():
            # post was valid. go back to page and display data
            return DetailView.as_view()(request(), form=RatingForm)
        else:
            # post was unsuccessful. go back to the page and display errors
            print form.errors
            return DetailView.as_view()(request(), form=form)

和我的模板

{% extends "base.html" %}
{% block content %}
    <h1>{{ arena.address }}</h1>
    <h1>{{ arena.address_2 }}</h1>
    <h1>{{ arena.phone }}</h1>

    {% if form.errors %}
        {% for field in form %}
            {% for error in field.errors %}
                <div class="alert alert-error">
                    <strong>{{ error|escape }}</strong>
                </div>
            {% endfor %}
        {% endfor %}
        {% for error in form.non_field_errors %}
            <div class="alert alert-error">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endif %}
    <form action="/arenas/rate/" method="post">
        {% csrf_token %}
        {{ form }}
    <input type="submit" value="Submit" />
    </form>

    <div>
        {{comments}}
    </div>
{% endblock %}

所以我想做的是在用户提交页面上的表单之后我想回到我所在的同一个详细信息页面,并且要么显示用户在那里发布的数据在评论部分,如果它成功或重定向回到同一页面,但如果不成功则表格有错误。我的问题是现在我不知道如何保留网址并形成错误以再次显示详细信息页面。我不认为我可以使用return DetailView.as_view()(context(), form=form),因为我的DetailView没有帖子所以我得到了405.我看到的每个例子都没有涵盖重定向到同一页面。他们通常只显示HttpResponseRedirect(/thanks)或类似的东西。

另请注意。我不想发布到/ arena / 123,因为最终这将是更新有关该地点的信息的另一个功能,所以我不想将评论发布在该网址上。

1 个答案:

答案 0 :(得分:1)

所以我挖掘了更多Django示例,偶然发现了SingleObjectMixin。结合FormView似乎是我想要的。 Django文档的例子是我想要的{99}的{99}。{3}}。请务必阅读here部分。

我将观点改为

class DetailView(LoginRequiredMixin, generic.DetailView):
    model = Arena
    template_name = 'arenas/detail.html'

    def get_context_data(self, **kwargs):
        print kwargs
        context = super(DetailView, self).get_context_data(**kwargs)
        context['form'] = RatingForm
        return context


class RatingView(LoginRequiredMixin, detail.SingleObjectMixin, generic.FormView):
    model = Arena
    template_name = 'arenas/detail.html'
    form_class = RatingForm

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super(RatingView, self).post(request, *args, **kwargs)

    def get_success_url(self):
        print "successfully posted"
        return reverse('arenas:detail', kwargs={'pk': self.object.pk})

添加了使用/ rate

发布表单的路由
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+)/rate/$', views.RatingView.as_view(), name='rate')
                       )

并稍微修改了我的模板,以便在帖子操作中将对象id传递给我的路线

{% extends "base.html" %}
{% block content %}
    <h1>{{ arena.address }}</h1>
    <h1>{{ arena.address_2 }}</h1>
    <h1>{{ arena.phone }}</h1>

    {% if form.errors %}
        {% for field in form %}
            {% for error in field.errors %}
                <div class="alert alert-error">
                    <strong>{{ error|escape }}</strong>
                </div>
            {% endfor %}
        {% endfor %}
        {% for error in form.non_field_errors %}
            <div class="alert alert-error">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endif %}
    <form action="/arenas/{{ arena.id }}/rate/" method="post">
        {% csrf_token %}
        {{ form }}
    <input type="submit" value="Submit" />
    </form>

    <div>
        {{comments}}
    </div>
{% endblock %}

现在出现错误,上下文被保留,SingleObjectMixin / FormView组合让我在同一页面上显示表单错误,在成功的帖子上它重定向到我希望使用get_success_url加载的详细信息页面该页面再次显示已发布的新信息。