代码之家  ›  专栏  ›  技术社区  ›  Venkat Kotra

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

  •  0
  • Venkat Kotra  · 技术社区  · 7 年前

    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 Django1.11应该在自动提交模式下工作,但changeForm_视图似乎与文档不一致。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 回复  |  直到 7 年前
        1
  •  2
  •   Kevin Christopher Henry    7 年前

    你误解了 the documentation .

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

    “违约行为”是指“交易范围没有具体指导的行为”。在 changeform_view 您引用的代码显式使用事务API,表示它不想使用默认的自动提交模式。

    请注意,您的更改不会确保代码以自动提交模式运行。这是因为任何从内部调用的函数 _changeform_view 可能自己使用事务API,从而禁用自动提交。许多Django使用事务,因为它们对于确保正确的行为至关重要。

    所以没有任何设置或其他方法可以在所有Django中禁用事务API。