【问题标题】:Ensuring Users Have Completed Prior Form Before Progressing To The Next Form确保用户在进入下一个表单之前已经完成了之前的表单
【发布时间】:2020-09-09 22:22:16
【问题描述】:

我有一份大型问卷供用户填写。因为它太大了,我决定把它分成三个连续的页面上的三个单独的表格。

网址是:问卷/section_1、问卷/section_2、问卷/section_3。

在提交每个表单后,表单数据被保存到数据库中,在最终(第 3 个)表单之后,三个表单被保存为该用户的单个 pdf。用户必须完成三份问卷中的每一份。

我的问题是用户将能够使用地址栏输入 www.website/questionnaire/section_3 并仅完成第三部分,跳过前两个并提交不完整的问卷。

我想不出任何方法来限制用户访问表单的后面部分,直到前面的部分被成功验证并保存。

PS - 我考虑过为三个表单中的每一个设置权限,一旦用户提交了一个表单就为他们添加权限,但我觉得这很hacky??

谢谢。

【问题讨论】:

    标签: django django-forms django-urls


    【解决方案1】:

    这就是我最终处理这个问题的方式。

    @allowed_users(allowed_roles=['admin', 'registered_user'])
    def page_two(request):
    
        if request.method == 'POST':
            form = FormTwoForm(request.POST, request.FILES, instance=request.user.formtwo)
            if form.is_valid():
                form.save()
    
                return redirect('page_three')
        else:
            # redirect if user didnt access the page from personal_information
            if(request.META.get('HTTP_REFERER') != request.build_absolute_uri(reverse('form_one'))):
                return redirect('form_one')
    
            else:
                form = FormTwoForm(instance=request.user.formtwo)
    
        context = {
            'form' : form
        }
    
        return render(request, 'example/form_two.html', context)
    
    
    
    @allowed_users(allowed_roles=['admin', 'registered_user'])
    def form_three(request):
    
        if request.method == 'POST':
            form = FormThreeForm(request.POST, request.FILES, instance=request.user.formthree)
            if form.is_valid():
               form.save()
    
               return redirect('form_four')
        else:
            # redirect if user didnt access the page from needs_analysis
            if(request.META.get('HTTP_REFERER') != request.build_absolute_uri(reverse('form_two'))):
                return redirect('form_two')
    
            form = FormThreeForm(instance=request.user.formthree)
    
        context = {
            'form' : form
        }
    
        return render(request, 'example/form_four.html', context)
    

    【讨论】:

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