【问题标题】:The view didn't return an HttpResponse object视图未返回 HttpResponse 对象
【发布时间】:2012-10-15 07:50:00
【问题描述】:

这是我得到的错误:视图 myapp.views.view_page 没有返回 HttpResponse 对象

谁能看到我在这里做错了什么?我似乎无法弄清楚为什么我会得到那个异常,因为我正在返回一个 HttpResponseRedirect。

views.py

from myapp.models import Page
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.template import Template, RequestContext
from django.core.context_processors import csrf

def view_page(request, page_name):
        try:
                    page = Page.objects.get(pk=page_name)
        except Page.DoesNotExist:
                    return render_to_response("create.html", {"page_name" :page_name},context_instance=RequestContext(request))

                    content=page.content
                    return render_to_response("view.html", {"page_name" :page_name , "content" :content},context_instance=RequestContext(request))

def edit_page(request, page_name):
        try:
                    page = Page.objects.get(pk=page_name)
                    content=page.content
        except Page.DoesNotExist:
                    content = ""
                    return render_to_response("edit.html", {"page_name" :page_name, "content" :content},context_instance=RequestContext(request))         

def save_page(request, page_name):
                content = request.POST["content"]
        try:
                    page = Page.objects.get(pk=page_name)
                    page.content=content

        except Page.DoesNotExist:
                    page = Page(name=page_name, content=content)
                    page.save()
                    return HttpResponseRedirect("/myproject/" + page_name + "/")

【问题讨论】:

  • 尝试返回一些东西。你只在except中返回一些东西。注释所有内容,例如 view_page 一种方法除外,并取消缩进返回以将其置于 try 级别。
  • 我认为你的缩进是错误的。
  • 要么取消缩进 return 语句,要么使用 finally 块

标签: python django django-views httpresponse


【解决方案1】:

当没有引发异常时,您的执行路径没有返回任何内容。您所拥有的缩进是将两个 return 语句都放在 except 块中;实际上从不执行第二次返回:

from django.shortcuts import render

def view_page(request, page_name):
    try:
        page = Page.objects.get(pk=page_name)
    except Page.DoesNotExist:
        return render(request,"create.html",{"page_name" :page_name})

    content=page.content
    return render(request,"view.html",{"page_name":page_name,"content":content})

您也需要对其他方法执行相同操作:

def edit_page(request, page_name):

    try:
        page = Page.objects.get(pk=page_name)
        content=page.content
    except Page.DoesNotExist:
        content = ""
    return render(request,"edit.html", {"page_name":page_name,"content":content})

def save_page(request, page_name):

    content = request.POST["content"]
    page,_ = Page.objects.get_or_create(pk=page_name)
    page.content = content
    page.save()
    return HttpResponseRedirect("/myproject/" + page_name + "/")

我正在使用render shortcut,它自动包含RequestContext

【讨论】:

  • 我用 render 改变了 render_to_response 但我的问题还在继续。
  • 因为你的其他方法也有同样的问题。
  • 是的,我知道,但我不知道我必须做什么
【解决方案2】:

您的缩进完全错误。 我不知道您是否已经解决了您的问题,但正如我在您询问一分钟后的第一条评论中所说的那样,您应该执行以下操作:

  • 评论除一种方法之外的所有内容
  • 例如保留方法view_page
  • 仔细看看试试
  • 请考虑以下问题:我是否在所有情况下都返回某些东西?
    • 我是否返回了 try 子句的内容?
    • 我是否在 except 子句中返回了某些内容?
    • 我的缩进可能错误

如果您仔细查看您的代码,您会发现它吗? :)

【讨论】:

    【解决方案3】:

    你的 view_page 函数是

    def view_page(request, page_name):
        try:
            page = Page.objects.get(pk=page_name)
            content=page.content
        except Page.DoesNotExist:
            content=None
        return render_to_response("view.html",{"page_name": page_name,
                                               "content": content},
                                  context_instance=RequestContext(request))
    

    编辑保存方法也一样

    def edit_page(request, page_name):
        try:
            page = Page.objects.get(pk=page_name)
            content=page.content
        except Page.DoesNotExist:
            content = ""
        return render_to_response("edit.html", {"page_name": page_name,
                                                "content": content},
                                  context_instance=RequestContext(request))         
    
    def save_page(request, page_name):
        content = request.POST["content"]
        try:
            page = Page.objects.get(pk=page_name)
            page.content=content
        except Page.DoesNotExist:
            page = Page(name=page_name, content=content)
        page.save()
        return HttpResponseRedirect("/myproject/" + page_name + "/")
    

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2020-11-01
      • 2014-12-03
      相关资源
      最近更新 更多