【问题标题】:request.session is not transferring full querydict to another viewrequest.session 没有将完整的查询字典传输到另一个视图
【发布时间】:2018-08-08 07:28:27
【问题描述】:

我正在使用“post”提交表单并使用 request.POST 将其数据传输到另一个视图,但是当我的查询字典到达第二个视图时,它是不完整的。

视图1

def question_filter(request):
    if request.method == 'POST':
        print('before validation', request.POST)
        request.session['question_data'] = request.POST
        return HttpResponseRedirect(reverse('qapp:question_preview'))

view2

def question_preview(request):
    all_questions = Questions.objects.all()
    question_data = request.session.get('question_data')
    print(question_data)
    question_pk_list = question_data['question_pk']
    preview_questions = all_questions.filter(id__in=question_pk_list)
    ...
    return render(request,'apps/qapp/question_preview.html', {somecontext})

我在这里做错了吗?

更新:

before validation <QueryDict: {'topics_all': ['1', '2'], 'csrfmiddlewaretoken': ['...'], 'subtopics_all': ['4', '2'], 'classroom': ['3'], 'difficulty': ['l', 'm']}>
[28/Feb/2018 17:17:39] "POST /question/filter/ HTTP/1.1" 302 0

(in the second view)question data {'topics_all': '2', 'csrfmiddlewaretoken': '...', 'difficulty': 'm', 'subtopics_all': '2', 'classroom': '3'}

【问题讨论】:

  • 你能在设置会话之前显示帖子的打印输出吗
  • @Exprator,我已经更新了问题的详细信息,请看一下
  • 会话未保存。看看我下面的答案。

标签: python django session view request


【解决方案1】:

你不能像这样发送所有post data,因为你有list inside your input names,,你必须以不同的方式访问每个名称并将它们设置在session中。

request.session['question_data'] = request.POST.getlist('topics_all')

其他input names也一样,然后在第二个视图中用键访问

【讨论】:

    【解决方案2】:

    默认情况下不保存会话。加request.session.modified = True

    def question_filter(request):
        if request.method == 'POST':
            print('before validation', request.POST)
            request.session['question_data'] = request.POST
            request.session.modified = True
            return HttpResponseRedirect(reverse('qapp:question_preview'))
    

    https://docs.djangoproject.com/en/2.0/topics/http/sessions/#when-sessions-are-saved

    编辑:

    您可以使用 json 破解它:

    import json
    
    def question_filter(request):
        if request.method == 'POST':
            print('before validation', request.POST)
            request.session['question_data'] = json.dumps(request.POST)
            return HttpResponseRedirect(reverse('qapp:question_preview'))
    
    def question_preview(request):
        all_questions = Questions.objects.all()
        question_data = json.loads(request.session.get('question_data'))
        print(question_data)
        question_pk_list = question_data['question_pk']
        preview_questions = all_questions.filter(id__in=question_pk_list)
        ...
        return render(request,'apps/qapp/question_preview.html', {somecontext})
    

    【讨论】:

    • 我尝试了你的建议,但在第二个视图中仍然不完整
    【解决方案3】:

    这有点老了,但是由于同样的问题,我绊倒了自己,我想为那些通过搜索找到这个问题的人提供一个解决方案,将整个 request.GETrequest.POST 对象存储在一个会话中而不丢失数据(与需要手动处理每个参数的 @Exprator 解决方案相反)。

    核心问题是default serializer Django 用于会话数据:django.contrib.sessions.serializers.JSONSerializer。此序列化程序不知道与多个值关联的键(对于它们,应该使用QueryDictgetlist() 方法),这会导致每个键的最后一个值被序列化。

    有两种可能的解决方案:

    • 在从会话中存储和检索时手动腌制和取消腌制request.GETrequest.POST 对象;
    • 或者,通过切换到django.contrib.sessions.serializers.PickleSerializer 来腌制整个会话数据。

    【讨论】:

      猜你喜欢
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多