08/27 Django admin相关

1、django-admin的简单回顾:html

admin: Django的后台数据管理的web版本git

一、adminweb

  a:models.pydjango

     - 建立表设计模式

  b:admin.py服务器

    - 注册表    admin.site.register(models.UserInfo)app

  c:urls.py
ide

   - url(r'^admin/', admin.site.urls),

  PS:
函数

    一、动态生成urlurl

    二、注册和生成url使用的都是admin.site

2、django-admin的用法

当咱们建立登陆admin的时候,里面会有增删改查,不单单是这些功能,咱们能够经过如下的方式设置一些样式

一、admin路由规则:

/admin/app01/role/           查看角色列表
/admin/app01/role/add/       添加角色
/admin/app01/role/2/change/  编辑
/admin/app01/role/2/delete/  删除
            
            
/admin/app01/userinfo/           /admin/应用名/表名
/admin/app01/userinfo/add/       /admin/应用名/表名/功能名

/admin/app01/userinfo/1/change/ /admin/app01/userinfo/1/delete/

 

2.自定义admin

建立models

from django.db import models

# Create your models here.


from django.db import models


# Create your models here.


class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()

    # 与AuthorDetail创建一对一的关系
    authorDetail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class AuthorDetail(models.Model):
    nid = models.AutoField(primary_key=True)
    birthday = models.DateField()
    telephone = models.BigIntegerField()
    addr = models.CharField(max_length=64)


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name


class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)

    # 与Publish创建一对多的关系,外键字段创建在多的一方
    publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)
    # 与Author表创建多对多的关系,ManyToManyField能够建在两个模型中的任意一个,自动建立第三张表
    authors = models.ManyToManyField(to='Author', )

    def __str__(self):
        return self.title
models.py

在admin.py中只须要讲Mode中的某个类注册,便可在Admin中实现增删改查的功能,如:

admin.site.register(models.Book)
admin.site.register(models.Author)
admin.site.register(models.Publish)

自定义更多操做:利用ModelAdmin

class Bookconfig(admin.ModelAdmin):     #自定义一个配置类,名字能够随意起,继承admin.ModelAdmin
    list_display = ['nid', 'title', 'publishDate', 'price']  #list_display,列表时,定制显示的列。
    list_filter = ['title', 'publish', 'authors']    #list_filter,列表时,定制右侧快速筛选。一对多或多对多更好用
    list_display_links = ['nid', 'title', 'publishDate', 'price']  #list_display_links,列表时,定制列能够点击跳转到编辑。
    search_fields = ['title', 'price']  #search_fields,列表时,模糊搜索的功能, def price_init(self, request, queryset):  #自定义actions 定义一个类,名字随意,须要三个参数
        queryset.update(price=0)  #函数内容,这个函数须要作什么,定制Action行为具体方法 
    price_init.short_description = '价格归零'  #中文显示自定义Actions
    actions = [price_init]    #把写好的函数放入列表,能够多放几个


admin.site.register(Book, Bookconfig)  #把类名写入注册的字段

更多方法:https://www.cnblogs.com/yuanchenqi/articles/8323452.html#_label1

 

2、admin源码

单例模式

单例模式(Singleton Pattern)是一种经常使用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你但愿在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

好比,某个服务器程序的配置信息存放在一个文件中,客户端经过一个 AppConfig 的类来读取配置文件的信息。若是在程序运行期间,有不少地方都须要使用配置文件的内容,也就是说,不少地方都须要建立 AppConfig 对象的实例,这就致使系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤为是在配置文件内容不少的状况下。事实上,相似 AppConfig 这样的类,咱们但愿在程序运行期间只存在一个实例对象。

class Settings():
    def __init__():
         self.app_namse=["app01","app02"]

s=Settings()

s.app_namse.append("app03")

实现单例模式:

(1)使用 __new__

为了使类只能出现一个实例,咱们可使用 __new__ 来控制实例的建立过程,代码以下:

class Settings(object):
    _instance = None
    def __new__(cls, *args, **kw):
        if not cls._instance:
            cls._instance = super(Settings, cls).__new__(cls, *args, **kw)
        return cls._instance
s1=Settings()
s2=Settings()

print(s1==s2)#True
print(id(s1))#32031408
print(id(s2))#32031408
结论:两个实例的id相同
咱们将类的实例和一个类变量 _instance 关联起来,若是 cls._instance 为 None 则建立实例,不然直接返回 cls._instance。

(2)使用模块

其实,Python 的模块就是自然的单例模式,由于模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,
而不会再次执行模块代码。所以,咱们只需把相关的函数和数据定义在一个模块中,就能够得到一个单例对象了。

 admin执行流程

1.启动:

django启动后,会加载settings中的install_app
           admin.py:
                from django.contrib.admin.sites import AdminSite, site
                autodiscover_modules('admin', register_to=site):加载每个app下的admin.py文件

2 注册
        源码:django.contrib.admin.sites模块
        class AdminSite(object):
              
                  def __init__(self):
                        self._registry = {}
              
                  def register(self,model,admin_class=None):
                       # 设置配置类
                       if not admin_class:
                            admin_class = ModelAdmin
                            
                       self._registry[model] = admin_class(model, self)        
             
        site = AdminSite()
        这里应用的是一个单例模式,对于AdminSite类的一个单例模式,执行的每个app中的每个admin.site都是一个对象
      

       每个app下的admin.py文件:
            from django.contrib import admin
            admin.site.register(Book,BookConfig)
            admin.site.register(Publish)

3 设计url

相关文章
相关标签/搜索