2

我从 def start 方法开始,它调用 go_adder 在 adder.html 中将 num 值相加 5 次,直到 num 等于 5。之后,adder 方法应该返回 ready=1

在views.py

def start(request):
    num=0
    ready_or_not=go_adder(num)
    return HttpResponse("Ready: %s "%str(ready_or_not))

def go_adder(num):
    ready=0
    if num<5:
        return render_to_response('adder.html',{'num':num})
    elif num==5:
        ready=1
        return ready

def check_post(request,num):
    if request.method == 'POST':
        num+=1
        return adder(num)

当我尝试运行此代码段时,它一直有效,直到我的“num = 5”,然后我得到那个错误:

'int' object has no attribute 'status_code' 
Exception Location: C:\Python27\lib\site-packages\django\middleware\common.py in process_response, line 94

和 Traceback 说:

C:\Python27\lib\site-packages\django\core\handlers\base.py in get_response
                response = middleware_method(request, response) ...
▶ Local vars
C:\Python27\lib\site-packages\django\middleware\common.py in process_response
        if response.status_code == 404: ...
▶ Local vars 

我该如何解决这个错误?请你帮助我好吗 ?

4

1 回答 1

8

django 视图需要返回一个HttpResponse对象。您正在这样做 while num < 5,但是当您返回 int 时num == 5

def adder(num):
    ready=0
    if num<5:
        num+=1
        # This renders the template and returns and HttpResponse; good
        return render_to_response('adder.html',{'num':num})
    elif num==5:
        ready=1
        # DONT RETURN AN INT HERE. RETURN AN HttpResponse
        return ready

如果你想要什么时候num==5返回一个数字 1 的纯文本响应,那么你可以返回一个 HttpResponse 并设置内容类型:

    elif num==5:
        ready=1
        return HttpResponse(str(ready), content_type="text/plain")

更新 1

根据我们的对话,您建议无论如何都希望视图不断传递计数值,并且您正在num以实际形式发布值。如果数量小于 5,则应返回一种模板,否则应返回另一种模板。

您可以将两个不同的视图组合成一个视图,以同时处理页面首次加载时的原始 GET 请求和表单提交的 POST 请求。只需确保将您的表单指向同一页面即可。

def check(request):
    num = 0

    if request.method == 'POST':
        num = int(request.POST.get('num'))

    return adder(num)

def adder(num):
    if num < 5:
        num += 1
        tpl_name = 'adder.html'
    else:
        tpl_name = 'print.html'

    return render_to_response(tpl_name, {'num':num})
  • check()是你的单一观点。
  • adder()是辅助函数,它将添加值、检查它并HttpResponse根据该值返回一个对象。您必须始终将其从您的视图返回给客户。
  • 两个模板都将传递包含值的上下文num

更新 2

您说您实际上是num通过 url 而不是通过 POST 表单传递的。对上一个示例进行小幅调整。你甚至adder()不再需要一个。您只需要一个视图。

将您的网址设置为具有可选num模式:

网址.py

(r'^checker/(?P<num>\d+)$', 'myapp.views.check')

视图.py

def check(request, num=0):
    num = int(num)
    if num < 5:
        num += 1
        tpl_name = 'adder.html'
    else:
        tpl_name = 'print.html'

    return render_to_response(tpl_name, {'num':num})

您的“检查器”网址现在有一个可选编号。如果没有在 url 中传递,它将是0视图中的值。如果您将其作为 POST 请求发送,它将添加并返回不同的模板。

于 2012-10-09T01:24:47.437 回答