0

ここの私のコードでは、

if ...:
    if form.is_valid():
                order_created = create_order(request,item)
                order_number = order_created.id
                if order_number:
                    ....

context = {'total':order_created.total}

私がこれを実行すると、私unboundlocal error,local variable 'order_created' referenced before assignmentは周りを見回しましたが、learnt実際にはそのブロックからブロック内の変数にアクセスできません。を使用してはいけないことも学びましたglobal statement。他にどのようにアクセスできますorder_createdか、ifブロックから宣言することもできましたが、それは順序を検証しません。

4

2 に答える 2

2

ビュー全体を貼り付けたわけではありませんが、フォームが無効な場合を考慮していないという事実からエラーが発生していると確信しています。

したがって、context辞書で使用する場合、order_createdは定義されていません。

したがって、次のようにする必要があります。

if form.is_valid():
    order_created = ....
else:
    order_created = None

context = {'total': order_created.total if order_created else None}

編集: ただし、これは django でフォームを処理する適切な方法ではないことに注意してください。これを読んでいただければ幸いです。フォームが有効で、注文が正常に作成されたら、ユーザーを別のビューにリダイレクトする必要があります

于 2013-04-30T12:37:24.580 に答える
2

Python のスコープは、おそらく他の構造化言語よりも少しブロック指向ではないため、コード パスが実際にそのブロックを通過する限り、ブロック外の変数にアクセスできます。たとえば、次のようにするとエラーが発生します。

b = False
if b:
    x = 5
print x

ただし、 x がブロックの外側にアクセスされている場合でも、これは行われません。

b = True
if b:
    x = 5
print x

トリックは、ブロックに入る前に変数を何かに設定することです:

order_created = None
if ...:
    if form.is_valid():
        order_created = create_order(request,item)
        order_number = order_created.id
        if order_number:
                ....
if order_created is not None:
    context = {'total':order_created.total}
else:
    context = ...
于 2013-04-30T12:43:55.550 に答える