一、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-hk/n/241388.html
微信掃一掃
支付寶掃一掃