繁体   English   中英

Django重定向回表单发布的上一页

[英]Django redirect back to previous page on form post

我正在尝试将表单发布重定向到它发布的页面。 因此,我的应用程序有一个详细页面,该页面显示有关地点/ 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,因为最终这将是更新有关该地点的信息的另一个功能,因此我不想将评论发布到该url上。

因此,我深入研究了一些Django示例,并偶然发现了SingleObjectMixin 这与FormView结合似乎是我想要的。 Django文档有,这是99.9%的什么我想要的例子在这里 只需确保阅读更好的解决方案部分。

我对此改变了看法

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其重定向到我想使用get_success_url再次使用新信息加载页面的详细信息页面那被张贴了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM