📅  最后修改于: 2023-12-03 14:40:45.900000             🧑  作者: Mango
在 Django Admin 中,我们可以创建只读模型,这些模型只能用于查看数据,并且不能进行编辑。这种模型适用于需要将数据以只读方式呈现给用户的情况,例如网站的仪表板。
要创建只读模型,我们需要定义一个 ModelAdmin 类并覆盖 get_readonly_fields()
方法。在这个方法中,我们返回一个包含要设置为只读的字段的元组。例如,以下代码将创建一个只读的 Order
模型:
from django.contrib import admin
from .models import Order
class ReadOnlyOrderAdmin(admin.ModelAdmin):
model = Order
def get_readonly_fields(self, request, obj=None):
return [field.name for field in self.model._meta.fields]
admin.site.register(Order, ReadOnlyOrderAdmin)
在这个例子中,get_readonly_fields()
返回一个包含 Order
模型中所有字段的元组,这表示所有字段都被设置为只读。如果您只想设置特定字段为只读,您可以将这些字段的名称添加到列表中。
为了确保只读模型中的数据不被意外更改或删除,我们可以通过覆盖 has_add_permission()
,has_delete_permission()
和 has_change_permission
() 方法来禁止对模型进行编辑。例如,以下代码将创建一个只读的 Order
模型,并禁止添加、删除和修改操作:
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .models import Order
class ReadOnlyOrderAdmin(admin.ModelAdmin):
model = Order
def get_readonly_fields(self, request, obj=None):
return [field.name for field in self.model._meta.fields]
def has_add_permission(self, request):
return False
def has_delete_permission(self, request, obj=None):
return False
def has_change_permission(self, request, obj=None):
return False
def get_actions(self, request):
actions = super().get_actions(request)
if 'delete_selected' in actions:
del actions['delete_selected']
return actions
def save_model(self, request, obj, form, change):
if change:
message = _('You are not allowed to change items in this read-only view.')
self.message_user(request, message, level='ERROR')
else:
super().save_model(request, obj, form, change)
admin.site.register(Order, ReadOnlyOrderAdmin)
在这个例子中,has_add_permission()
,has_delete_permission()
和 has_change_permission()
方法都返回 False,禁止添加、删除和修改操作。get_actions()
方法还覆盖了 delete_selected 操作,以确保在只读模型中不会删除任何数据。save_model()
方法还禁止对只读模型进行更改。