【问题标题】:What is the difference between “return my_view” and “return redirect(my_view)” and how to get a mixed result?“return my_view”和“return redirect(my_view)”有什么区别以及如何获得混合结果?
【发布时间】:2020-01-15 20:09:30
【问题描述】:

我有一个家,我有一个表格,我可以从学生那里获得一些信息,向他们推荐一些可以申请的课程。主视图如下:

def home(request):
    template_name = 'home.html'
    home_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            #  do some stuff
            return programs(request)
    else:
        my_form = MyModelForm()
    home_context.update({'my_form': my_form, })
    return render(request, template_name, home_context)

在第二个视图中,我有相同的表单,我希望该表单专注于我在主页中输入的信息。这就是为什么在上面,我将我的 POST 请求传递给程序视图,如下所示:

def programs(request):
    template_name = 'programs.html'
    programs_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            #  do some other stuff
    else:
        my_form = MyModelForm()
    programs_context.update({'my_form': my_form, })
    return render(request, template_name, programs_context)

这种策略的缺点(将主视图中的 POST 请求传递给程序视图)是 url bar 中的 url 不会更改为 'example.com/programs' 并保持为 'example.com' 。我会遇到一些问题,包括程序的分页问题。 另一种方法是我这样做:

def home(request):
    template_name = 'home.html'
    home_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            #  do some stuff
            return redirct(programs)
    else:
        my_form = MyModelForm()
    home_context.update({'my_form': my_form, })
    return render(request, template_name, home_context)

这种替代策略的问题是我在程序视图中看不到 my_form 专注于主页中提交的数据。 我想得到一个好坏参半的结果。预先占用表单并查看 URL 更改为“example.com/programs”。 注意:我没有显示 url 模式和模板中写的内容,我希望这些是隐含的。 我期望的是一个不向会话添加信息的解决方案。我只想将 POST 请求传递给程序视图。 如果没有办法不向会话中添加数据,那么向会话中添加数据的最佳方法表示赞赏。

请注意,当在主页中按下表单提交按钮时,我想引用程序视图的 request.POST。这是我目前正在使用的备选方案 1 的一个积极点。

在第一种方法中,如果我输入“example.com/programs”,则会触发程序视图的获取部分,如果我在主页上提交表单,则会触发主页视图的获取部分,然后是 POST部分程序视图被触发。这是我想要的行为。

【问题讨论】:

    标签: django forms redirect view request


    【解决方案1】:

    如果您对该问题进行更多搜索,您会发现重定向 POST 请求或通过重定向传递变量/上下文是不可能的。

    您提出的将 POST 数据存储在 request.session 中的解决方案都不是最佳解决方案。

    您可以return redirect(reverse('urlname') + query_string) 将 GET 查询字符串添加到 url 并在程序视图中从该查询字符串预填充表单。这将是更清洁的解决方案。

    【讨论】:

    • 重定向函数将 url 作为第一个参数,reverse 将 url 路径名反转为 url,通过 + 您将添加转储的 POST 数据作为查询字符串。示例return redirect(reverse('urlname') + '?' + urllib.parse.parse_qs(request.POST)) 以及稍后在另一个视图中。您可以使用来自request.GET 的预填充数据来实例化表单。
    • 我返回了redirect(reverse('urlname') + '?' + urllib.parse.parse_qs(request.POST)) 但我收到了这个错误:'QueryDict' 对象没有属性'decode'
    猜你喜欢
    • 2014-05-24
    • 2011-08-26
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多