【问题标题】:Django Manual Debugging Process FlowDjango 手动调试流程
【发布时间】:2013-07-16 23:58:21
【问题描述】:

我正在开发一个 Django 应用程序。我花了大约 40 到 50 个小时研究 Django,我正在准备申请!

但是,我开始遇到“更严重”的错误,有些人可能会这样称呼它们,因为我无法从堆栈跟踪中准确找出真正的问题是什么。

基本上,我点击我页面上的一个链接,就会弹出这个错误:

请求方法:GET 请求网址:/accounts/profile/ Django 版本:1.5.1 异常类型:ValueError 异常值:
*视图 userprofile.views.user_profile 未返回 HttpResponse 对象。*

这让我相信错误出现在我的视图文件中,除了我正在逐行遵循教程,并且我被引导相信错误可能在于使用 forms.py 创建 HttpResponse 对象的方式.

简而言之,代码是,

form = UserProfileForm(request.POST, instance=request.user.profile)
...
args = {}
args.update(csrf(request)) // security token
args['form'] = form
return render_to_response('profile.html', args)

profile.html 也绝对没问题,我对此进行了测试,我基本上是从 login.html 页面调用它,在该页面中显示有效的用户登录信息。

非常感谢您的帮助所以,我通常不问问题,但我已经被这个问题困住了 5-6 个开发小时。尽量不要嘲笑我不理解这个可能简单但隐藏的初学者错误:)

此外,如果您能说明您是如何解决此错误的,尤其是说明我的想法以及根本误解在哪里,我希望您能在回复中说明这一点。

在您的回答中,仅参考文档的特定实例,因为我已经进行了大量搜索,但也许它并没有完全缩小到我的问题所在:D

再次感谢,

詹姆斯

评论一:教程

Here is the tutorial我指的是。在我尝试单击超链接之前,我一直在识别错误​​,因为我拥有所有代码并且一切正常。我对错误的来源哪里没有经验。

第二条评论:相关代码

userprofile/views.py

 def user_profile(request):
    if request.method=='POST':
       form = UserProfileForm(request.POST, instance=request.user.profile)
       if form.is_valid():
          form.save()
          return HttpResponseRedirect('/accounts/loggedin')
       else:
          user = request.user
          profile = user.profile
          form = UserProfileForm(instance=profile)

       args = {}
       args.update(csrf(request)) // security token
       args['form'] = form
       return render_to_response('profile.html', args)

myapp urls.py,用户配置文件 urls.py

(r'^accounts/', include ('userprofile.urls')),
...
url(r'^profile/$', 'userprofile.views.user_profile'),

【问题讨论】:

  • 您能否发布指向您正在学习的教程的链接?并告诉我们您坚持的哪一部分?
  • 嗨詹姆斯。您对 Django 非常熟悉;) 您介意将整个视图的代码与您的 urls.py 一起发布吗?
  • 到目前为止我很喜欢它。我刚刚添加了链接,稍后我将添加代码:)

标签: python django django-models django-forms django-views


【解决方案1】:

如果这真的是您的视图代码,那是一个简单的缩进错误。应该是:

def user_profile(request):
    if request.method=='POST':
        form = UserProfileForm(request.POST, instance=request.user.profile)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/loggedin')
    else:
        user = request.user
        profile = user.profile
        form = UserProfileForm(instance=profile)

    args = {}
    args.update(csrf(request)) // security token
    args['form'] = form
    return render_to_response('profile.html', args)

当 request.METHOD 为 GET 时,初始 if 上没有 else 子句,所以视图函数结束时没有返回任何内容。相反,您想要创建表单,将其添加到上下文中并呈现它 - 因为它是 GET 请求,或者因为表单中存在错误,并且您想要重新呈现上下文以显示这些错误并允许用户进行更正。

【讨论】:

  • 我将 tabspace 设置为 3... 或者您是指 args ...... 没有正确嵌套?
  • args 和整个表单的创建,是的 - 它们缩进太远,所以它们只在 request.method == 'POST' 而不是 form.is_valid() 时被调用。
  • 非常感谢。我有一种感觉,像这样微不足道的事情。我其实很担心自己的 GET 请求。再次感谢。
  • 另一件引起我注意的事情 - 仔细检查 urls.py/accounts/loggedin 的定义。要求 URL 以尾随 / 结尾是很常见的,如果 urls.py 文件适用于该视图,那么您的成功重定向将引发异常。您可能需要/accounts/loggedin/,具体取决于它的声明方式 - 尽管最终的最佳方法是了解其他选项以指定重定向到的位置,我相信您的教程最终会涵盖这些选项。
猜你喜欢
  • 1970-01-01
  • 2018-10-13
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2015-11-29
  • 2021-02-12
  • 2016-02-17
相关资源
最近更新 更多