深入探索DjangoXAdmin

一、DjangoXAdmin项目实战

DjangoXAdmin提供了一种简单、快速、功能丰富的方式来构建后台管理系统。我们可以用它来管理我们的数据库、用户信息,生成CRUD操作界面等等。下面就来介绍一下如何进行一个DjangoXAdmin的实战。

1、安装DjangoXAdmin

pip install django-xadmin

安装后,在INSTALLED_APPS中添加xadmin和crispy_forms,如下:

INSTALLED_APPS = [
    ...
    'xadmin',
    'crispy_forms',
    ...
]

2、创建管理员账号

Django自带的后台管理需要创建一个超级管理员账号,DjangoXAdmin也是如此,我们可以使用createsuperuser命令来创建超级管理员账户。

python manage.py createsuperuser

3、注册应用

接下来我们需要在xadmin.py文件中对我们的应用进行注册,示例如下:

import xadmin
from .models import UserProfile

class UserProfileAdmin(object):
    list_display = ('username', 'email', 'mobile')

xadmin.site.register(UserProfile, UserProfileAdmin)

这里我们将用户信息模型注册到了xadmin,并且定义了我们想要在列表页展示的字段。

二、Django admin

Django admin是一个提供了多种管理功能的后台管理系统,其使用方法和DjangoXAdmin类似,但是功能和界面要简单许多。

1、启用Django admin

Django自动创建的后台管理系统默认是关闭的,我们需要在admin.py文件中进行注册和启用,示例如下:

from django.contrib import admin
from .models import UserProfile

admin.site.register(UserProfile)

2、自定义管理页面

我们可以在admin.py文件中定义一个ModelAdmin类,并且在注册模型的时候指定这个类,然后我们就可以在这个类中自定义管理页面的各种内容了。示例如下:

from django.contrib import admin
from .models import UserProfile

class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('username', 'email', 'mobile')

admin.site.register(UserProfile, UserProfileAdmin)

三、Django admin 美化

Django admin默认的页面样式比较简单,但是我们可以使用第三方库进行美化。

1、使用Django Suit

Django Suit是一个非常流行的Django后台管理系统美化库,它提供了许多主题,可以让Django的后台管理系统看起来非常漂亮。

pip install django-suit

安装后,在settings.py文件中添加以下配置:

INSTALLED_APPS = [
    ...
    'suit',
    ...
]

# Django Suit configuration example
SUIT_CONFIG = {
    # header
    'ADMIN_NAME': 'My Custom Admin',

    # forms
    'SHOW_REQUIRED_ASTERISK': True,  # Default True
    'CONFIRM_UNSAVED_CHANGES': True,  # Default True

    # menu
    'SEARCH_URL': '/admin/auth/user/',
    'LIST_PER_PAGE': 15,

    'MENU_ICONS': {
        'auth': 'icon-lock', 
        'sites': 'icon-leaf',
    },

    # misc
    'LIST_SELECTABLE_PER_PAGE': 15,
    'LIST_MAX_SHOW_ALL': 200,
}

2、使用Django Grappelli

Django Grappelli也是一个非常流行的Django后台管理系统美化库,它提供了许多主题,可以让Django的后台管理系统看起来非常漂亮。

pip install django-grappelli

安装后,在settings.py文件中添加以下配置:

INSTALLED_APPS = [
    ...
    'grappelli',
    ...
]

# ... your additional sets here
GRAPPELLI_ADMIN_TITLE = "My Custom Admin"

四、Django admin源码分析

Django admin接受请求后是如何进行处理的?Django admin的后台管理页面是如何渲染出来的?接下来我们来分析Django admin的源码。

1、Django admin的urls.py

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls), # Django admin的路由
]

2、Django admin的源码目录结构

├── __init__.py
├── actions.py
├── apps.py
├── checks.py
├── decorators.py
├── default.py
├── filters.py
├── forms.py
├── helpers.py
├── __init__.py
├── list.py
├── options.py
├── register.py
├── sites.py
├── templates
│   ├── admin
│   │   ├── app_index.html
│   │   ├── base.html
│   │   ├── change_form.html
│   │   ├── change_list.html
│   │   ├── date_hierarchy.html
│   │   ├── delete_confirmation.html
│   │   ├── delete_selected_confirmation.html
│   │   ├── object_history.html
│   │   ├── pagination.html
│   │   ├── password_change_done.html
│   │   ├── password_change_form.html
│   │   ├── password_reset_complete.html
│   │   ├── password_reset_confirm.html
│   │   ├── password_reset_done.html
│   │   ├── password_reset_email.html
│   │   ├──/search_form.html
│   │   └── toolbars
│   │       ├── delete.html
│   │       ├── object.html
│   │       ├── pagination.html
│   │       └── submit_line.html
│   └── registration
│       ├── activation_complete.html
│       ├── activation_email.html
│       ├── activation_failed.html
│       ├── activation_success.html
│       ├── login.html
│       ├── logged_out.html
│       ├── password_change_done.html
│       ├── password_change_form.html
│       ├── password_reset_complete.html
│       ├── password_reset_confirm.html
│       ├── password_reset_done.html
│       └── password_reset_form.html
├── templatetags
│   ├── admin_list.py
│   ├── admin_modify.py
│   └── log.py
├── urls.py
├── utils.py
├── views
│   ├── autocomplete.py
│   ├── base.py
│   ├── custom.py
│   ├── deprecated.py
│   ├── doc.py
│   ├── extra.py
│   ├── main.py
│   └── RelatedObjectLookup
│       ├── __init__.py
│       └── related_objects.py
└── widgets.py

3、Django admin的处理模块

Django admin的处理模块主要由以下几个模块组成:

  • models.py:定义所有需要管理的model
  • admin.py:分别定义每个model的管理model
  • views.py:定义视图函数
  • templates:定义HTML模板文件

五、django admin自定义页面

Django admin默认模板有时不能够满足我们的需求。此时我们可以自定义Django admin的页面来扩展其功能。

1、自定义页面模板

可以定义自己的模板,就像这样:

from django.contrib import admin
from django.urls import path
from django.http import HttpResponse
from django.template.response import TemplateResponse

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    def view_custom_link(self, obj):
        return TemplateResponse(request, 'path_to_template/mymodel_custom_view.html', context=context)

    view_custom_link.short_description = 'View Custom Data'

    list_display = ['view_custom_link']

2、自定义页面视图

可以定义自己的视图,并在model的admin中自定义action。

from django.contrib import admin
from django.urls import path
from django.http import HttpResponse

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    def view_custom_link(self, obj):
        return self.view_custom_data(obj.id)

    view_custom_link.short_description = 'View Custom Data'

    def view_custom_data(self, pk):
        .....

六、Django admin界面美化

除了使用第三方库之外,我们还可以通过Django admin的静态文件进行界面美化。

1、自定义静态文件

可以与Django的静态文件一样来管理静态文件,例如favicon.ico。

python manage.py collectstatic

2、重写base_site.html文件

可以在模板中重写base_site.html文件来自定义页面。

{% extends "admin/base.html" %}

{% load static %}

{% block extrahead %}
    {{ block.super }}
    
{% endblock %}

七、Django admin高级定制

对于更复杂的场景,我们可能需要更高级的定制方式,例如自定义对不同用户的界面展现、添加新的模型行为等等。

1、自定义菜单

可以对menu进行自定义,在admin.py中添加以下代码:

from django.contrib import admin

class MyAdminSite(admin.AdminSite):
    site_header = 'My Site'

admin_site = MyAdminSite(name='myadmin')

2、自定义modeladmin

可以自定义modeladmin中的数据或方法,例如自定义一个display_name字段。

from django.contrib import admin
from django.utils.html import format_html
from my_app.models import Person

class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'display_name')

    def display_name(self, obj):
        return format_html('{}'.format(obj.first_name + ' ' + obj.last_name))

3、自定义model

可以自定义model中的数据或者方法,例如自定义一个get_full_name()方法。

from django.contrib.auth.models import AbstractUser
from django.db import models

class MyUser(AbstractUser):
    def get_full_name(self):
        return self.first_name + ' ' + self.last_name

4、自定义表单

使用Widget、Form或Field可以很容易的对表单进行自定义。

from django.forms import ModelForm, TextInput
from my_app.models import Person

class PersonForm(ModelForm):
    class Meta:
        model = Person
        fields = '__all__'
        widgets = {
            'first_name': TextInput(attrs={'class': 'form-control'}),
            'last_name': TextInput(attrs={'class': 'form-control'}),
        }

至此,我们已经对DjangoXAdmin进行了从实战到源码分析的全面了解,并且掌握了通过自定义模板、视图和样式来对其进行高级定制的方法。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/241388.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:32
下一篇 2024-12-12 12:32

相关推荐

  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25
  • 深入剖析MapStruct未生成实现类问题

    一、MapStruct简介 MapStruct是一个Java bean映射器,它通过注解和代码生成来在Java bean之间转换成本类代码,实现类型安全,简单而不失灵活。 作为一个…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25

发表回复

登录后才能评论