【问题标题】:Django work flow redirect from one view to another and display page with url parameterDjango 工作流程从一个视图重定向到另一个视图并显示带有 url 参数的页面
【发布时间】:2015-12-19 10:51:31
【问题描述】:

我正在尝试创建一个网络应用程序,用户将选择一个文件,处理数据,然后重定向到带有 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'),
]

【问题讨论】:

  • 您有错误信息吗?请张贴。
  • 请显示您在运行代码时遇到的错误 a
  • 您好,没有显示错误,模板只是加载,根本没有重定向到 confirm_inputs 视图。该页面使用 url "127.0.0.1/myapp?status=1 加载。我希望调用 confirm_input 视图,然后调用模板。

标签: python django parameters django-views url-routing


【解决方案1】:

我觉得您的代码中存在几个问题:

  • 缩进是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
    

    将相对/绝对网址(两者都可以)放在上面。

  • 最后,使用上下文参数在“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)) 
    

** PS:坚持简洁的基础知识,它会起作用。您碰巧从同一视图本身中调用了您的 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. 

如果没有渲染模板,您不能期望页面显示出来。

【讨论】:

  • 非常感谢您的回答,它让一切变得更加清晰。我一直在使用代码 sn-ps,我认为来自不同版本的 Django。我重新设计了整个应用程序。代码更加简单明了。这个问题已经解决了。
猜你喜欢
  • 2015-12-12
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2020-01-01
  • 2016-04-02
  • 2018-10-26
  • 1970-01-01
相关资源
最近更新 更多