一、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
微信扫一扫
支付宝扫一扫