深入探索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/zh-hant/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

發表回復

登錄後才能評論