📜  django admin 只读模型 - Python (1)

📅  最后修改于: 2023-12-03 14:40:45.900000             🧑  作者: Mango

Django Admin 只读模型

在 Django Admin 中,我们可以创建只读模型,这些模型只能用于查看数据,并且不能进行编辑。这种模型适用于需要将数据以只读方式呈现给用户的情况,例如网站的仪表板。

在 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() 方法还禁止对只读模型进行更改。