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

相關文章
相關標籤/搜索