2

def start メソッドから始めます。go_adder を呼び出して、num が 5 になるまで adder.html に 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

トレースバックは次のように述べています。

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 when を返します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

数値 1 のプレーン テキスト応答を返すことだけが必要な場合num==5は、HttpResponse を返し、コンテンツ タイプを設定できます。

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

更新 1

私たちの会話に基づいて、ビューが何があっても常にカウント値を渡すこと、およびnum実際の形式で値を POST することを提案しました。数が 5 未満の場合、ある種類のテンプレートを返す必要があります。それ以外の場合は、別の種類のテンプレートを返す必要があります。

ページが最初にロードされたときの元の GET リクエストと、フォームによって送信された POST リクエストの両方を処理する 1 つに、2 つの異なるビューを組み合わせることができます。フォームが同じページを指すようにしてください。

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は POST フォームではなく、URL を介して渡していると言いました。最後の例を少し調整します。もう必要ありadder()ません。必要なビューは 1 つだけです。

numオプションのパターンを持つように URL を設定します。

urls.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 にオプションの番号が追加されました。URL で渡されない場合は0、ビューの値になります。POST リクエストとして送信すると、別のテンプレートが追加されて返されます。

于 2012-10-09T01:24:47.437 に答える