django - 總結 - admin

由於admin在啓動後會自動執行每一個app下的ready方法:
具體是由
from django.utils.module_loading import autodiscover_modules
這個函數完成的。
def autodiscover():
    autodiscover_modules('admin', register_to=site)
自動去全部app下 調用 admin
  • 建立一個組件:stark,
    • 在app.py裏的配置編寫ready方法:
      • 程序加載時,會去每一個app下找stark.py,並加載
  • 在每一個app下建立stark.py
    • 將表註冊到stark中  

固然admin是寫到了init裏python

----------> 在setting裏只寫app/一直寫到配置類   是有區別的,後者執行ready方法django

 
 
# models
# __all__ = ['tables1',]

# admin
# from . import models
# for tables in models.__all__:
#     admin.site.register(getattr(models,table))

  

 

1. 使用管理工具:app

經過命令 python manage.py createsuperuser 來建立超級用戶。
ide

2. admin的定製:函數

方式一:
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd',)
admin.site.register(models.UserInfo, UserAdmin)

方式二:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd',)
list_display = ["name", "pwd", "date", "xxx"]  # 顯示的字段,不能顯示多對多字段
list_display_links = ["pwd"]  # 顯示的字段哪些能夠跳轉
list_filter = ["pwd"]  # 哪些能夠篩選
list_select_related = []  # 連表查詢是否自動select_related
list_editable = ["name"]  # 能夠編輯的列
search_fields = ["name"]  # 模糊搜索的字段
date_hierarchy = "date"  # 對Date和DateTime進行搜索

def add(self, request, queryset):
    pass

add.short_description = "在action框中顯示的名稱"

actions = [add, ]  # 定製action行爲具體方法
actions_on_top = True  # action框顯示在上?
actions_on_bottom = False  # action框顯示在下?
actions_selection_counter = True  # 是否顯示選擇個數

  inlines,詳細頁面,若是有其餘表和當前表作FK,那麼詳細頁面能夠進行動態增長和刪除工具

class UserInfoInline(admin.StackedInline): # TabularInline extra = 0 model = models.UserInfo class GroupAdminMode(admin.ModelAdmin): list_display = ('id', 'title',) inlines = [UserInfoInline, ]

10 定製HTML模板post

add_form_template = None
change_form_template = None change_list_template = None delete_confirmation_template = None delete_selected_confirmation_template = None object_history_template = None

11 raw_id_fields,詳細頁面,針對FK和M2M字段變成以Input框形式url

raw_id_fields = ('FK字段', 'M2M字段',)

12  fields,詳細頁面時,顯示字段的字段spa

fields = ('user',)

13 exclude,詳細頁面時,排除的字段code

exclude = ('user',)

14  readonly_fields,詳細頁面時,只讀字段

readonly_fields = ('user',)

15 fieldsets,詳細頁面時,使用fieldsets標籤對數據進行分割顯示

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin): fieldsets = ( ('基本數據', { 'fields': ('user', 'pwd', 'ctime',) }), ('其餘', { 'classes': ('collapse', 'wide', 'extrapretty'), # 'collapse','wide', 'extrapretty' 'fields': ('user', 'pwd'), }), )

16 詳細頁面時,M2M顯示時,數據移動選擇(方向:上下和左右)

filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)

17 ordering,列表時,數據排序規則

ordering = ('-id',) 或 def get_ordering(self, request): return ['-id', ]

18. radio_fields,詳細頁面時,使用radio顯示選項(FK默認使用select)

radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL

19 form = ModelForm,用於定製用戶請求時候表單驗證

from app01 import models from django.forms import ModelForm from django.forms import fields class MyForm(ModelForm): others = fields.CharField() class Meta: model = models = models.UserInfo fields = "__all__" @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): form = MyForm

20 empty_value_display = "列數據爲空時,顯示默認值"

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin): empty_value_display = "列數據爲空時,默認顯示" list_display = ('user','pwd','up') def up(self,obj): return obj.user up.empty_value_display = "指定列數據爲空時,默認顯示"

2、單例模式

1. 使用 __new__

爲了使類只能出現一個實例,咱們可使用 __new__ 來控制實例的建立過程,代碼以下:

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

class MyClass(Singleton):  
    a = 1

2. 使用模塊

class My_Singleton(object):
    x = 12
    def foo(self):
        print(self.x)

my_singleton = My_Singleton()

print('ok')

將上面的代碼保存在文件 mysingleton.py 中,而後這樣使用:

from mysingleton import my_singleton
 
my_singleton.foo()

 


知識點:

url()的使用:
path('yuan/',([path('test01/',test01)],None,None)), # yuan/test01
        path('yuan/',([
                path('test01/',([
                    path('test04/',test04),                        # yuan/test01/test04
                    path('test05/',test05)                         # yuan/test01/test05
                                ],None,None)),
                path('test02/',test02),                            # yuan/test02
                path('test03/',test03)                             # yuan/test03
                            ],None,None))    
 
注: re_path(r'^test04/',test04), # 以test04開頭;
re_path(r'test04/',test04), # 包含test04;
相關文章
相關標籤/搜索