每当我尝试检查相应视图有@transaction.commit_manually
装饰器的模板中的权限时,我收到此错误Transaction managed block ended with pending COMMIT/ROLLBACK
。当检查权限时,Django事务托管块以挂起的COMMIT/ROLLBACK结尾
模板:
<!-- html stuff -->
{% if perms.myApp.add_table1 %}
{# show html elements #}
{% endif %}
一旦我删除权限,条件,不存在错误。与权限无关的if
条件没问题,例如{% if user.is_superuser %}{% endif %}
UPDATE:即使权限检查不在视图呈现的模板上,但是从其扩展而来,它仍然存在此错误。
例如nav_bar.html中的权限检查,以及查看渲染扩展nav_bar.html的费用.html会导致相同的错误。
view.py:
@transaction.commit_manually
def add_expense(request):
# do stuff here
我试过去掉装饰,也没有任何形式的异常,一切正常。但是,当我把装饰上,出现错误
urls.py:
# other stuff omitted
(r'^myApp/expenses/add/$', add_expense),
更新#2:
当用户是超级用户,没有任何问题为好。我相信,这是因为它不打扰检查的权限,因为用户是超级用户
此外,我已经包括了代码
@login_required()
@transaction.commit_manually
def add_expense(request):
request.session.set_expiry(1800)
if request.method == 'POST':
form_input = AddExpense(request.POST)
if form_input.is_valid():
try:
# after validation data is cleaned
cd = form_input.cleaned_data
# cleaned data is a dictionary
input_date = date.today()
user = request.user.username
new_record = table1.objects.create(
amount = cd['amount'],
date = cd['date_of_expense'],
username = user
)
new_record.save()
transaction.commit()
return render_to_response('forms/add_expense_success.html', context_instance=RequestContext(request))
except Exception, e:
pass
transaction.rollback()
return HttpResponse(None)
else:
return render_to_response('forms/add_expense.html', {'form': form_input},
context_instance=RequestContext(request))
else:
# loading this gives error, not sure the top part
form = AddExpense()
return render_to_response('forms/add_expense.html', {'form': form, 'page_title': '新增支出'},
context_instance=RequestContext(request))
不是答案本身,而只是双重检查:你必须在你的“#do的东西在这里”代码块结束时器transaction.commit()? – aychedee 2012-02-13 11:21:06
它是在一个条件下,所以不,不一定。但我不相信这会产生效果。向每个条件添加'transaction.commit()'/'transaction.rollback()'会导致相同的错误。 – 2012-02-13 11:23:50