在Django 1.11更改视图中禁用原子事务

时间:2019-01-08 15:04:24

标签: django django-forms django-views django-admin django-1.11

Django 1.11具有以下代码段

@csrf_protect_m
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    with transaction.atomic(using=router.db_for_write(self.model)):
        return self._changeform_view(request, object_id, form_url, extra_context)

env/lib/python3.6/site-packages/django/contrib/admin/options.py

根据doc,Django 1.11应该在自动提交模式下工作,但changeform_view似乎与文档不符。 Django管理表单保存在事务中进行。

我通过重写模型的ModelAdmin类中的方法来解决。

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    return self._changeform_view(request, object_id, form_url, extra_context)

但是有没有办法为所有具有设置的模型的Django表单启用自动提交模式?

1 个答案:

答案 0 :(得分:2)

您误解了the documentation

  

Django的默认行为是在自动提交模式下运行。

此处的“默认行为”是指“在缺乏有关交易范围的具体指导时的行为”。在您引用的changeform_view中,该代码显式使用了事务API,表示它不想使用默认的自动提交模式。

请注意,所做的更改将无法确保代码在自动提交模式下运行。这是因为从_changeform_view内部调用的任何函数本身都可能使用事务API,从而禁用了自动提交。 Django的许多部分都使用事务,因为它们对于确保正确的行为至关重要。

因此,没有设置或其他方法可以在整个Django中禁用事务API。