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



我目前正在开发Django中的Web应用程序。在我的提交页面上(带有"提交视图"的"提交.html"(,用户可以提交一些数据并选中一些复选框。这一切都被处理(这可能需要一些时间(,然后在"output.html"(带有"OutputView"(中显示输出表。

我想得到的是,当表单提交时,用户被重定向到"进程.html"页面(带有"ProcessView"(,其中将显示带有javascript的虚拟进度条,只是为了让用户知道处理数据需要多长时间。当所有内容都经过处理并且结果可用时,用户会自动重定向到"输出.html",结果表将可见。

到目前为止,我设法重定向了来自请求的所有输入。从提交视图到进程视图的 POST 后,所有内容都会被处理并再次重定向到输出视图。但!提交表单时,它只是停留在提交.html页面上(url下方有加载栏(,当一切都处理完毕时,输出将显示在output.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")

我的进程视图:

class ProcessView(View):
def post(self, request, *args, **kwargs):
#Some stuff gets done here
return redirect(reverse('output'))

我的输出视图:

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( 用户
  • 提交表单 -> SubmitView 中的 def post(( 将用户重定向到进程.html (进程视图(
  • 2(在进程中.html(ProcessView中的def get(((,用芹菜初始化异步任务来处理用户提交的数据
  • 3( 同时,虚拟加载杆正在运行.html
  • 4(芹菜任务完成后,将用户重定向到输出.html

  • ProcessView中启动异步任务的问题在于它创建了一个无限循环,因为您总是返回def get((函数并重新启动进程。
  • 提交视图中初始化任务是不可能的,因为这样你必须将变量"result"(带有会话(传递给ProcessView,这是不可能的(这会产生以下错误:"AsyncResult"类型的对象不可JSON序列化(

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

相反,SubmissionView.post 将不得不使用return HttpResponseRedirect重定向到reverse('process')。这将重定向到进程视图。

然后,当ProcessView上的加载栏完成时,javascript将不得不重定向到OutputView(它必须有权访问来自SubmitView的输入(

相关内容

  • 没有找到相关文章

最新更新