一、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