如何使用parse_qs从视图重定向到另一个?

时间:2019-09-15 06:36:43

标签: django forms redirect view

我有一所房子,里面有一张可以从学生那里获得一些信息的表格,以建议他们一些可以应用的程序。主页视图如下:

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请求传递到programs_view)是,网址栏中的网址不会更改为“ 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
            querystring = request.POST
            return redirect(reverse('programs') + '?' + parse_qs(querystring, keep_blank_values=True))
    else:
        my_form = MyModelForm()
    home_context.update({'my_form': my_form, })
    return render(request, template_name, home_context)

首先,执行此操作时出现错误:“ QueryDict”对象没有属性“ decode”

第二,我不知道要在程序视图中做什么以利用要发送到程序视图的get分支的查询。

第三,如果它是来自重定向而不是来自独立的直接get请求,则需要在程序视图的get分支中的程序视图的post分支中做过的工作。如何在程序获取请求中区分这一点?

总体上,我们高度赞赏任何替代解决方案和帮助。

3 个答案:

答案 0 :(得分:0)

使用request.GET ['your_key']获取在查询字符串中传递的数据。

您可以选中this SO answer

答案 1 :(得分:0)

这根本不是parse_qs所做的。解析是将字符串(即查询字符串)转换为可用的对象;相反,您需要做的是,将POST转换为查询字符串;即对其进行编码,而不对其进行解析。

请注意,尽管您已称之为request.POST,但它不是查询字符串,而是QueryDict。要将dict编码为字符串,可以使用urlencode方法:request.POST.urlencode()

但是,这仍然行不通,因为重定向始终是GET,而您的目标表单需要POST。这根本不是正确的方法。相反,我要做的是将querydict存储在会话中,然后在第二个视图中从那里使用它。

答案 2 :(得分:0)

我有一所房子,里面有一张可以从学生那里获得一些信息的表格,以建议他们一些可以应用的程序。主页视图如下:

def home(request):
    template_name = 'home.html'
    home_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            querystring = urlencode(request.POST)
            return redirect(reverse('programs') + '?' + querystring)

    else:
        my_form = MyModelForm()
    home_context.update({'my_form': my_form, })
    return render(request, template_name, home_context)

在程序视图中

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:
        # if the get is from redirect
            my_form = MyModelForm(request.GET)
            #  do some other stuff
        # else:
            my_form = MyModelForm()
    programs_context.update({'my_form': my_form, })
    return render(request, template_name, programs_context)

我现在想通过检查请求是来自输入example.com/programs还是来自主视图的重定向部分来将程序视图的get方法划分为多个部分。这样做的标准方法是什么?上面写的if和else的标准写法是什么?

相关问题