📜  自定义 Django 管理界面(1)

📅  最后修改于: 2023-12-03 15:11:47.589000             🧑  作者: Mango

自定义 Django 管理界面

Django 自带的管理界面 admin 是一个非常好用的工具,但是对于一些需要更定制化的应用来说,可能无法满足需求。这时候,我们就需要自定义 Django 管理界面,进行更良好的用户体验和更好的数据展示。

为什么需要自定义 Django 管理界面?
  1. 具体业务要求:例如我们需要显示一些非模型类的信息或者将某些模型合并在一起展示,这时候就需要自定义管理界面。
  2. 更好的用户体验:我们可以更合理地安排布局和展示方式,让数据更好的展现出来,让用户更好地使用我们的应用。
  3. 安全性问题:某些业务不希望每个用户都能看到所有的数据,这时候我们可以对管理界面进行更细致的权限控制。
如何自定义 Django 管理界面?
  1. 自定义 admin 模板:我们可以通过修改 admin 模板的方式,来改变管理界面的布局和展示方式。可以在 templates/admin 目录下创建自定义的 admin 模板,然后在 ModelAdmin 中使用 change_form_templatechange_list_template 等属性来指定使用的模板。
# admin.py
class CustomModelAdmin(admin.ModelAdmin):
    change_form_template = 'admin/custom_change_form.html'
    list_display = ('id', 'name')
  1. 自定义 admin form:我们可以通过自定义 ModelForm 的方式,来改变字段的展示方式,增加自定义的验证规则等。同样可以在 ModelAdmin 中使用 form 属性来指定使用的 Form。
# forms.py
from django import forms
from .models import CustomModel

class CustomModelForm(forms.ModelForm):
    def save(self, commit=True):
        # 具体自定义的逻辑
        return super().save(commit=commit)

    class Meta:
        model = CustomModel
        fields = '__all__'

# admin.py
class CustomModelAdmin(admin.ModelAdmin):
    form = CustomModelForm
    list_display = ('id', 'name')
  1. 通过自定义 admin view:我们可以完全自定义 admin 的视图函数,来控制管理界面的数据展示、数据逻辑等。可以通过继承 AdminSite、ModelAdmin 等类来实现。
# admin.py
from django.contrib.admin import AdminSite
from django.contrib.admin.views.main import ChangeList

class CustomAdminSite(AdminSite):
    site_header = 'My Custom Admin'
    site_title = 'My Custom Admin'

class CustomChangeList(ChangeList):
    def get_queryset(self, request):
        # 具体自定义的逻辑
        return super().get_queryset(request)

    def get_results(self, request):
        # 具体自定义的逻辑
        return super().get_results(request)

    # 更多自定义方法的实现,参考 ChangeList 类的源代码

class CustomModelAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

CustomAdminSite.register(CustomModel, CustomModelAdmin)

admin_site = CustomAdminSite()
总结

通过以上三种方式,我们可以实现对 Django 管理界面的自定义,提升用户体验和安全性。在实际项目中,具体使用哪种方式,取决于业务需求和个人爱好。