Django重定向到视图进行处理,然后重定向到outputVi

2024-10-03 23:19:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在Django开发一个webapp。在我的提交页面上('提交.html'使用'SubmissionView'),用户可以提交一些数据并选中一些复选框。所有这些都得到处理(这可能需要一些时间),然后输出表显示在'输出.html'(带“OutputView”)。在

我想要的是当表单被提交时,用户被重定向到进程.html'页面(带有'ProcessView'),其中一个带有javascript的虚拟进度条将可见,只是让用户知道处理数据需要多长时间。当所有处理完毕且结果可用时,用户将自动重定向到'输出.html'结果表将可见。在

到目前为止,我成功地将来自请求.POST从SubmissionView到ProcessView,所有内容都得到处理并再次重定向到OutputView。但是!提交表单时,它只保留在提交.html页面(在url下面有加载条),当一切都在处理中时,输出将显示在输出.html. 这个进程.html页面从不显示。在

我不知道如何先展示进程.html页,在后台运行分析(在我的ProcessView中),完成后显示输出。谁能帮忙吗?在

我的提交视图:

class SubmissionView(View):


    def get(self, request, *args, **kwargs):
        form = UploadFileModelForm(request.POST, request.FILES)
        mailform = Email()
        context = {
            "form":form,
            "mailform": mailform,
        }
        return render(request, "webtool/submission.html", context)


    def post(self, request, *args, **kwargs):
       form = UploadFileModelForm(request.POST, request.FILES)
        if form.is_valid():
            instance = form.save()

            #Some stuff gets done here

            request.session['toprocess'] = {
                "somevar":     somevar,
            }


            return render(request, "webtool/process.html")

我的流程视图:

^{pr2}$

我的输出视图:

class OutputView(View):
    def get(self, request, *args, **kwargs):

    #some stuff gets done here

    return render(request, "webtool/output.html", context)

更新:

class SubmissionView(View):
    def get(self, request, *args, **kwargs):
        form = UploadFileModelForm(request.POST, request.FILES)
        mailform = Email()
        context = {
            "form":form,
            "mailform": mailform,
        }
        return render(request, "webtool/submission.html", context)


    def post(self, request, *args, **kwargs):
       form = UploadFileModelForm(request.POST, request.FILES)
        if form.is_valid():
            instance = form.save()

            #Some stuff gets done here

            request.session['toprocess'] = {
                "somevar":     somevar,
            }

            return redirect(reverse('process'))

class ProcessView(View):
    def get(self, request, *args, **kwargs):
        #This is what initializes the celery task
        result = task.delay()
        if result.ready() == False:
            return redirect(reverse('process'))
        elif result.ready() == True:
            return render(request, "webtool/output.html")

理想情况下

  • 1) 用户提交表单->;SubmissionView中的def post()将用户重定向到进程.html(ProcessView)
  • 2) 在进程.html(ProcessView内部的def get()),一个异步任务用celery初始化以处理用户提交的数据
  • 3) 同时,一个假加载杆正在磨合进程.html在
  • 4) 完成芹菜任务后,将用户重定向到输出.html在

但是

  • 启动异步的问题。ProcessView中的任务是创建一个无限循环,因为您总是返回def get()函数并重新启动进程。在
  • 无法在SubmissionView中初始化任务,因为之后必须将变量“result”(with session)传递给ProcessView,这是不可能的(这会导致以下错误:“AsyncResult”类型的对象不是JSON可序列化的)

Tags: 用户selfformgetreturn进程requestdef
1条回答
网友
1楼 · 发布于 2024-10-03 23:19:53

您的提交视图实际上并没有重定向到您的流程视图。它只是呈现流程模板,但只在SubmissionView中运行post方法。在

相反,提交后视图将必须使用return HttpResponseRedirect重定向到reverse('process')。将重定向到ProcessView。在

然后,当ProcessView上的加载条完成时,javascript必须重定向到OutputView(它必须能够访问SubmissionView中的输入)

相关问题 更多 >