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 事务中间件正在使用中,它将在视图函数引发异常时中止包含事务:http: //docs.pylonsproject.org/projects/pyramid_tm/en/latest/#transaction-usage

使用 明确提交transaction.commit(),或者更好的是,返回HTTPFound而不是提高它。

于 2012-09-26T05:10:34.983 回答