【问题标题】:Django how to do a conditional redirect after POST?Django如何在POST后进行条件重定向?
【发布时间】:2019-11-29 05:20:17
【问题描述】:

我有一个表单,其中显示了用户个人资料中的一些字段以及其他内容。在此表单中,配置文件中的字段被禁用。如果详细信息已过时,用户可以转到编辑配置文件视图并更新详细信息。为此,我在表单模板中包含了一个按钮。更新配置文件后,我希望用户返回表单。最后一部分是我遇到问题的部分。

从表单中编辑个人资料的链接如下所示:

<a class="btn btn-outline-info" href="{% url 'profile'%}?next={% url 'submission_resume' %}">Edit Profile</a>

这是来自表单的 url 的外观:

http://127.0.0.1:8000/users/profile/?next=/submissions/resume/

问题是在编辑配置文件视图中我不知道如何实现条件重定向:

def profile(request):
    """ View and edit the profile. It requires user to be login """
    if request.method == 'POST':
        form = UserModifyForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            messages.success(request, f'Your account has been updated!')
            #??? if next in url go back to the form ???
            #??? return redirect(???) ???
            #??? else: ???
            return redirect('profile')
    else:
        form = UserModifyForm(instance=request.user)
 #--> Dict for template with the forms
    context = {
        'form': form,
    }
 #--> Show profile page
    return render(request, 'user_profile.html', context)   
#---

【问题讨论】:

    标签: django redirect


    【解决方案1】:

    使用这个:

    redirect_to = request.POST.get("next", "profile")
    return redirect(redirect_to)
    

    【讨论】:

    • 提交表单时用户数据是否发生了变化,唯一的问题是重定向?也许您正在向您的视图发送GET 请求。
    • 是的,用户资料已更新。重定向是唯一的问题
    【解决方案2】:

    我设法通过将视图更改为:

    def profile(request):
        """ View and edit the profile. It requires user to be login """
        if request.method == 'POST':
            form = UserModifyForm(request.POST, instance=request.user)
            if form.is_valid():
                form.save()
                messages.success(request, f'Your account has been updated!')
                redirect_to = request.POST['redirect_to']
                return redirect(redirect_to)
        else:
            redirect_to = request.GET.get("next", "profile")
            form = UserModifyForm(instance=request.user)
     #--> Dict for template with the forms
        context = {
            'redirect_to': redirect_to,
            'form'       : form,
        }
     #--> Show profile page
        return render(request, 'user_profile.html', context)   
    #---
    

    并在模板中包括:

    <input type="hidden" name='redirect_to' value="{{redirect_to}}">
    

    &lt;form&gt; 标签内

    但我仍然想知道是否有更简单的方法来做到这一点。

    【讨论】:

    • 你能不能把你的要求说清楚一点,是不是每当表单被编辑和保存时,你想将用户重定向到“下一页”页面,每当没有任何表单提交时你想要将用户重定向到默认页面。这是正确的吗?
    • @Pradeep 用户开始填写表格,并意识到表格中显示的联系方式已过时,因此他单击了表格中的一个按钮,将用户带到个人资料编辑页面。用户完成编辑配置文件并点击提交以保存配置文件中的更改。如果用户从表单到达编辑配置文件页面,则页面会在保存更改后将用户重定向回表单。如果不是来自表单,则显示带有新值的配置文件。
    • 保存表单后,您可以在views.py中使用“return redirect(request.META.get('HTTP_REFERER'))”将用户重定向到上一个页面
    • @Pradeep 是的,但它不仅仅是回去。如果用户在主页上并决定更新个人资料,那么在更新后我希望用户留在个人资料页面上。如果用户在表单中并决定更新配置文件,那么它将返回。
    【解决方案3】:
    request.POST.get('redirect_to', None))
    

    上面的语句将给出redirect_to的值,如果它存在,否则它会返回'None'

    你可以试试

    request.POST.get('redirect_to', 'replace the value with default view where you want to redirect'))
    

    如果您只是想重定向到上一页,也可以尝试以下代码

     redirect(request.META.get('HTTP_REFERER'))
    

    【讨论】:

    • 问题是如何在post变量中包含redirect_to。正如我的回答中的一个 cmet 中所解释的那样,返回选项也不够
    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 2018-04-04
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多