2

ユーザーが情報を入力できるようにするビューを作成し、その情報を新しいレコードとして Pyramid フレームワークを使用してデータベースに挿入しました。コードは次のようになります。

def orderplace_view(request):
    user = User.get(authenticated_userid(request))
    cart = Cart.get_by_user(user)

    if cart.itemtypes == None:  # cat is empty
        request.session.flash(u'Empty cart')
        raise HTTPFound(location = request.route_url('cart'))

    placeorderform = PlaceOrderForm(request.POST)
    placeorderform.address.query = UserAddress.query_by_user(user)

    if request.POST and placeorderform.validate():
        # create order
        order = Order()
        order.address = placeorderform.address.data

        # fill order with other attributes...
        user.orders.append(order)

        # IMPORTANT LINE!!!
        raise HTTPFound(location = request.route_url('order_list'))

    return {'user': user,
        'title': 'place order',
        'cart': cart,
        'placeorderform': placeorderform}

奇妙なことに、「raise HTTPFound()」行をコメントアウトすると、すべてが正常に機能し、新しい注文がデータベースに挿入されます。しかし、ユーザーを注文一覧ページにリダイレクトする行をそのままにしておくと、注文が挿入されません! なぜこれが起こったのですか?

4

1 に答える 1

3

Pyramid トランザクション ミドルウェアが使用されている場合、view 関数が例外を発生させると、含まれているトランザクションを中止します: http://docs.pylonsproject.org/projects/pyramid_tm/en/latest/#transaction-usage

で明示的にコミットしtransaction.commit()ますHTTPFound

于 2012-09-26T05:10:34.983 に答える