首先禁用交易添加和更改数据时,需要覆盖更改表单视图() https://github.com/django/django/blob/main/django/contrib/admin/options.py#L1743 in Person
admin如下所示:
# "store/admin.py"
from django.contrib import admin
from .models import Person
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_protect
csrf_protect_m = method_decorator(csrf_protect)
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
@csrf_protect_m # Here
def changeform_view(self, request, object_id=None, form_url="", extra_context=None):
return self._changeform_view(request, object_id, form_url, extra_context)
因为默认情况下,更改表单视图() https://github.com/django/django/blob/main/django/contrib/admin/options.py#L1743 has with transaction.atomic(...):
to use 交易添加和更改数据时如下所示:
class ModelAdmin(BaseModelAdmin):
# ...
@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)): # Here
return self._changeform_view(request, object_id, form_url, extra_context)
结果添加数据时如下图:
交易未使用如下所示:
并且,当更改数据时,如下所示:
交易未使用如下所示:
接下来要禁用交易当点击时Delete
button of 换人然后点击Yes, I'm sure
button要删除数据,您需要覆盖删除视图() https://github.com/django/django/blob/main/django/contrib/admin/options.py#L2102 in Person
admin如下所示:
# "store/admin.py"
from django.contrib import admin
from .models import Person
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_protect
csrf_protect_m = method_decorator(csrf_protect)
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
@csrf_protect_m # Here
def delete_view(self, request, object_id, extra_context=None):
return self._delete_view(request, object_id, extra_context)
因为默认情况下,删除视图() https://github.com/django/django/blob/main/django/contrib/admin/options.py#L2102 has with transaction.atomic(...):
to use 交易当点击时Delete
button of 换人然后点击Yes, I'm sure
button删除数据如下图:
class ModelAdmin(BaseModelAdmin):
# ...
@csrf_protect_m
def delete_view(self, request, object_id, extra_context=None):
with transaction.atomic(using=router.db_for_write(self.model)): # Here
return super()._delete_view(request, object_id, extra_context)
结果,当点击Delete
button of 换人如下所示:
然后点击Yes, I'm sure
button删除数据如下图:
交易未使用如下所示:
最后,您不需要禁用交易 for Delete selected persons
因为默认情况下交易不用于Django 管理操作包括Delete selected persons
。 *你可以看到my post https://stackoverflow.com/questions/74965894/by-default-is-transaction-used-in-django-admin-actions解释更多关于默认情况下,Django 管理操作为非事务.