Django 工作流从一个视图重定向到另一个视图并使用 url 参数显示页面
Django work flow redirect from one view to another and display page with url parameter
我正在尝试创建一个网络应用程序,用户将 select 一个文件,处理数据,然后重定向到带有 url 参数的确认页面(?status=1) 如何我从处理视图移动到确认视图,然后显示确认页面?
我已将我的代码放在下面,但在我的视图和 urls py 文件
中不起作用
# views.py
def marketdata_processing(request):
if request.method == 'POST':
uploadform = forms.MyUploadForm(request.POST, request.FILES)
if uploadform.is_valid():
newdoc = models.UploadDocument(docfile=request.FILES['uploadfile'])
filename = request.FILES['uploadfile'].name
newdoc.save()
selecteddate = newdoc.getselecteddate() # Model method calculated
fileid = newdoc.pk
request.session['fileid'] = fileid
request.session['selecteddate'] = selecteddate
return redirect(reverse('views.confirm_input_details'))
else:
uploadform = forms.MyUploadForm()
# Render list page with the documents and the form
return render_to_response(
'mytemplate.html',
{'uploadform': uploadform},
context_instance=RequestContext(request)
)
def confirm_input_details(request):
fileid = request.session['fileid']
selecteddate = request.session['selecteddate']
msg = 'Proceed to import data for %s? \nFileID Being Imported is %s ' % (
selecteddate, fileid,)
url = reverse('views.confirm_input_details', kwargs={'status': 1})
return HttpResponseRedirect(url)
# urls.py
urlpatterns = [
url(r'', views.marketdata_processing, name='myapp/mytemplate.html'),
url(r'^\?status=(?P<status>[0-9]+)$',
views.confirm_input_details, name='myapp/myconfirmpage.html'),
]
我觉得您的代码中存在几个问题:
缩进在python代码中是一个非常重要的东西。请确保 'marketdata_processing' 视图中的 if-else 语句的缩进顺序正确。当心,在你的代码中:
return render_to_response('mytemplate.html',
{'uploadform': uploadform},
context_instance=RequestContext(request))
将始终执行,因为它在 else 语句之外。你可能想在 else 下缩进它(如果有意义的话)——像这样:
else:
uploadform = forms.MyUploadForm()
return render_to_response('mytemplate.html',
{'uploadform': uploadform},
context_instance=RequestContext(request))
而不是 'redirect(reverse())' 在处理视图中尝试 'HttpResponseRedirect()' 调用确认页面视图,如下所示:
from django.http import HttpResponseRedirect
return HttpResponseRedirect('/?status=1') --> relative URL shown
将 relative/absolute url(两者都可以)放在上面。
最后,使用上下文参数在 'confirm_input_details' 视图中呈现您的确认页面模板,如下所示:
def confirm_input_details(request):
fileid = request.session['fileid']
selecteddate = request.session['selecteddate']
msg = 'Proceed to import data for %s? \nFileID Being Imported is %s ' % (selecteddate, fileid)
return render_to_response('confirmpage_template.html'),
{'fileid': fileid,
'selecteddate': selecteddate,
'msg': msg}, context_instance=RequestContext(request))
** P.S:坚持整洁的基础,它会奏效。您碰巧从同一视图本身调用了 confirm_input_details 视图。据我所知,这可能会将您带入无限循环。任何视图的简单概念是:
take input:request, parameters
--> process logic with parameters
--> render a specific template or call another url where a template is being rendered.
如果没有呈现模板,您不能指望页面会显示。
我正在尝试创建一个网络应用程序,用户将 select 一个文件,处理数据,然后重定向到带有 url 参数的确认页面(?status=1) 如何我从处理视图移动到确认视图,然后显示确认页面?
我已将我的代码放在下面,但在我的视图和 urls py 文件
# views.py
def marketdata_processing(request):
if request.method == 'POST':
uploadform = forms.MyUploadForm(request.POST, request.FILES)
if uploadform.is_valid():
newdoc = models.UploadDocument(docfile=request.FILES['uploadfile'])
filename = request.FILES['uploadfile'].name
newdoc.save()
selecteddate = newdoc.getselecteddate() # Model method calculated
fileid = newdoc.pk
request.session['fileid'] = fileid
request.session['selecteddate'] = selecteddate
return redirect(reverse('views.confirm_input_details'))
else:
uploadform = forms.MyUploadForm()
# Render list page with the documents and the form
return render_to_response(
'mytemplate.html',
{'uploadform': uploadform},
context_instance=RequestContext(request)
)
def confirm_input_details(request):
fileid = request.session['fileid']
selecteddate = request.session['selecteddate']
msg = 'Proceed to import data for %s? \nFileID Being Imported is %s ' % (
selecteddate, fileid,)
url = reverse('views.confirm_input_details', kwargs={'status': 1})
return HttpResponseRedirect(url)
# urls.py
urlpatterns = [
url(r'', views.marketdata_processing, name='myapp/mytemplate.html'),
url(r'^\?status=(?P<status>[0-9]+)$',
views.confirm_input_details, name='myapp/myconfirmpage.html'),
]
我觉得您的代码中存在几个问题:
缩进在python代码中是一个非常重要的东西。请确保 'marketdata_processing' 视图中的 if-else 语句的缩进顺序正确。当心,在你的代码中:
return render_to_response('mytemplate.html', {'uploadform': uploadform}, context_instance=RequestContext(request))
将始终执行,因为它在 else 语句之外。你可能想在 else 下缩进它(如果有意义的话)——像这样:
else: uploadform = forms.MyUploadForm() return render_to_response('mytemplate.html', {'uploadform': uploadform}, context_instance=RequestContext(request))
而不是 'redirect(reverse())' 在处理视图中尝试 'HttpResponseRedirect()' 调用确认页面视图,如下所示:
from django.http import HttpResponseRedirect return HttpResponseRedirect('/?status=1') --> relative URL shown
将 relative/absolute url(两者都可以)放在上面。
最后,使用上下文参数在 'confirm_input_details' 视图中呈现您的确认页面模板,如下所示:
def confirm_input_details(request): fileid = request.session['fileid'] selecteddate = request.session['selecteddate'] msg = 'Proceed to import data for %s? \nFileID Being Imported is %s ' % (selecteddate, fileid) return render_to_response('confirmpage_template.html'), {'fileid': fileid, 'selecteddate': selecteddate, 'msg': msg}, context_instance=RequestContext(request))
** P.S:坚持整洁的基础,它会奏效。您碰巧从同一视图本身调用了 confirm_input_details 视图。据我所知,这可能会将您带入无限循环。任何视图的简单概念是:
take input:request, parameters
--> process logic with parameters
--> render a specific template or call another url where a template is being rendered.
如果没有呈现模板,您不能指望页面会显示。