前言:Django是一个python大而全的前端框架,Django自带的admin也是一个不错的信息管理系统,功能多,可拓展性强。那么,我们仿照Django-admin能不能自己写代码实现admin的主要功能呢?答案是当然可以!!!通过这个小项目的练习,可以更加深刻地理解其中的编程原理,升华自己的思想。
废话少说,接下来开始进入正题!!!
一、新建Django项目
Django的项目新建这里就不说了,此处省略100字.......
注意:需要注册两个app(stark,app01)stark是admin的翻版,名字无所谓。
二、修改stark中apps的代码
通过看django的源码可以得知:Django启动时,自动加载settings配置文件中的installed_apps,然后执行源码中的autodiscover()方法来顺序加载apps对应的admin.py文件。所以我们可以通过修改apps中的代码让django来执行我们写的stark.py文件而不执行admin.py文件.
stark中的apps.py文件:
from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules
class StarkConfig(AppConfig):
name = 'stark'
# 这个ready方法是固定不变的
def ready(self):
autodiscover_modules('stark')
三、重写StarkSite类的register方法来实现model的注册
先在app名为stark的文件夹下新建一个servers包,在servers下新建一个site.py文件,在site.py文件中写如下代码:
class StarkSite(object):
def __init__(self):
#定义一个字典用于存储接下来需要注册的model和对应congfig配置类
self._registry = {}
def register(self, model, admin_class=None):
# 设置配置类,有自定义的就用自定义的,没有就用默认的ModelStark
if not admin_class:
admin_class = ModelStark
#以model为键,配置类实例化对象为值进行注册
self._registry[model] = admin_class(model)
site = StarkSite()
四、在每个app下新建stark.py文件,通过调用StarkSite类来注册model表
执行每个app下的stark.py文件来注册所有app下用户提交的需要注册的model表和对应的config配置类
app01下的stark.py:
//导入默认配置类ModelStark,(这个类稍后再创建)
from stark.servers.site import ModelStark
//site是StarkSite类的实例化对象,通过模块导入实现的单利模式
from stark.servers.site import site
//导入app01下的models文件
from app01 import models
//注册models表
site.register(models.Book)
site.register(models.Publish)
site.register(models.Author)
site.register(models.AuthorDetail)
另附app01下的models.py:
from django.db import models
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32,verbose_name='作者')
age = models.IntegerField(verbose_name="年龄")
# 与AuthorDetail建立一对一的关系
authorDetail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)
def __str__(self):
return self.name
class AuthorDetail(models.Model):
nid = models.AutoField(primary_ke