一、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-tw/n/241388.html