如何在 Django 2 中的 POST 方法后重定向到成功

Posted

技术标签:

【中文标题】如何在 Django 2 中的 POST 方法后重定向到成功【英文标题】:How to redirect to success after POST method in Django 2 【发布时间】:2018-07-20 08:49:06 【问题描述】:

我想知道如何处理来自 FormView 类的 GETPOST 请求以呈现GET 的未绑定表单并将表单发布到POST 的数据库并随后重定向到成功页面(信息消息)。

GETPOST 方法使用什么模板以及如何在重定向到成功 URL 后包含消息?

views.py:

from django.shortcuts import render,redirect,render_to_response,get_object_or_404
from django.forms import ModelForm
from django.views import View

from django.views.generic.edit import CreateView
from .forms import MyPlaceForm
from .models import Place
from django.urls.base import reverse_lazy


from django.contrib import messages


#Ceate your class-based views here.
class MapView(View):
    def get(self, request):
        'Display map'
        return render(request,template_name='index.html')

# Handling forms with class-based view
class PlaceFormView(View):
    form_class = MyPlaceForm
    initial = 'key': 'value'
    template_name = 'name.html'

    # Provide Blank Form if GET request
    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        return render(request, self.template_name, 'form': form)

# Provide a message if POST request
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        success_url=reverse_lazy('success')
        if form.is_valid():
            # <process form cleaned data>

            messages.add_message(request, messages.INFO, 'Hello world.')
            return reverse_lazy(success_url)

        return render(request, self.template_name, 'form': form)

urls.py:

from django.contrib import admin
from django.http import HttpResponse
from django.urls import path
from addismap.views import MapView,PlaceFormView


urlpatterns=[
    path('map/',MapView.as_view()),
    path('place/', PlaceFormView.as_view(), name='post-place'),
    path('place/success/',PlaceFormView.as_view(), name='success')

    ]

【问题讨论】:

您没有使用 FormView。如果你是,所有这些代码都会为你完成。 Daniel Roseman 能否提出修改建议? 从 FormView 继承,删除你的 get 和 post 方法。 【参考方案1】:

按照documentation,您可以执行以下操作:

# views.py    
if request.method == "POST":

    if form.is_valid():

        # <process form cleaned data>
        messages.success(request, 'Form updated with success.')
        return redirect('/success-page')

    else:       
        messages.error(request, 'Ops! Something went wrong')
        return redirect('/error-page')

在您的模板页面中,您可以使用 for 循环代码获取消息:

% if messages %
% for message in messages %
<div % if message.tags % class="alert alert- message.tags  alert-dismissible fade show" % endif %>
    <span> message </span>
</div>
% endfor %
% endif %

Edit1:确保你已经在你的views.py中导入了消息标签和重定向

from django.contrib import messages
from django.shortcuts import render, redirect

【讨论】:

谢谢,但我没有成功 URL 重定向到错误,虽然我把“注册”作为成功 URL。 您不需要专门的“成功页面”,您可以通过成功消息重定向回表单的同一页面

以上是关于如何在 Django 2 中的 POST 方法后重定向到成功的主要内容,如果未能解决你的问题,请参考以下文章

POST django rest 框架后重定向

使用 jquery 在 POST 请求后重定向

django - 注册用户后重定向到页面

如何配置在Django中注销后重定向到哪里?

如何配置在Django中注销后重定向到哪里?

如何仅在 Django Rest Framework 中的另一个 API 方法中调用 API POST 方法