【问题标题】:How to use parse_qs in redirecting from view to another?如何使用 parse_qs 从视图重定向到另一个视图?
【发布时间】:2020-01-16 09:33:56
【问题描述】:

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

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
            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' object has no attribute 'decode'

其次,我不知道如何在程序视图中使用我发送到程序视图的 get 分支的查询。

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

总的来说,我们非常感谢任何替代解决方案和帮助。

【问题讨论】:

    标签: django forms redirect view


    【解决方案1】:

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

    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 的标准写法是什么?

    【讨论】:

      【解决方案2】:

      这根本不是parse_qs 所做的。解析是获取一个字符串 - 即一个查询字符串 - 并将其转换为可用的对象;你想做的是相反的,把 POST 变成一个查询字符串;即对其进行编码,而不是对其进行解析。

      注意,不管你怎么称呼它,request.POST 不是一个查询字符串,它是一个 QueryDict。要将字典编码为字符串,您可以使用urlencode 方法:request.POST.urlencode()

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

      【讨论】:

      • 我将发布我所做的作为答案并添加我的问题。感谢您的回复。
      【解决方案3】:

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

      您可以查看this SO answer

      【讨论】:

        猜你喜欢
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多