一. 內置Admin

依賴APP:
django.contrib.auth
django.contrib.contenttypes
django.contrib.messages
django.contrib.sessions
模板的context_processors:
django.contrib.auth.context_processors.auth
django.contrib.messages.context_processors.messages
中間件:
django.contrib.auth.middleware.AuthenticationMiddleware
django.contrib.messages.middleware.MessageMiddleware
1.配置路由
urlpatterns = [ url(r'^admin/', admin.site.urls), ]

/admin/ /admin/login/ /admin/logout/ /admin/password_change/ /admin/password_change/done/ /admin/app名稱/model名稱/ /admin/app名稱/model名稱/add/ /admin/app名稱/model名稱/ID值/history/ /admin/app名稱/model名稱/ID值/change/ /admin/app名稱/model名稱/ID值/delete/
2.定制Admin
在admin.py中只需要將Model中的某個類注冊, 即可在Admin中實現增刪改查的功能,
admin.site.register(models.UserInfo)
但是,這種方式比較簡單,如果想要進行更多的定制操作,需要利用ModelAdmin進行操作,如:
方式一: 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',)
ModelAdmin中提供了大量的可定制功能,如

1. list_display,列表時,定制顯示的列。 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): list_display = ('user', 'pwd', 'xxxxx') def xxxxx(self, obj): return "xxxxx" 2. list_display_links,列表時,定制列可以點擊跳轉。 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): list_display = ('user', 'pwd', 'xxxxx') list_display_links = ('pwd',) 3. list_filter,列表時,定制右側快速篩選。 from django.utils.translation import ugettext_lazy as _ @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): list_display = ('user', 'pwd') class Ugg(admin.SimpleListFilter): title = _('decade born') parameter_name = 'xxxxxx' def lookups(self, request, model_admin): """ 顯示篩選選項 :param request: :param model_admin: :return: """ return models.UserGroup.objects.values_list('id', 'title') def queryset(self, request, queryset): """ 點擊查詢時,進行篩選 :param request: :param queryset: :return: """ v = self.value() return queryset.filter(ug=v) list_filter = ('user',Ugg,) 4. list_select_related,列表時,連表查詢是否自動select_related 5. 分頁相關 # 分頁,每頁顯示條數 list_per_page = 100 # 分頁,顯示全部(真實數據<該值時,才會有顯示全部) list_max_show_all = 200 # 分頁插件 paginator = Paginator 6. list_editable,列表時,可以編輯的列 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): list_display = ('user', 'pwd','ug',) list_editable = ('ug',) 7. search_fields,列表時,模糊搜索的功能 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): search_fields = ('user', 'pwd') 8. date_hierarchy,列表時,對Date和DateTime類型進行搜索 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): date_hierarchy = 'ctime' 9. preserve_filters,詳細頁面,刪除、修改,更新后跳轉回列表后,是否保留原搜索條件 10. save_as = False,詳細頁面,按鈕為“Sava as new” 或 “Sava and add another” 11. save_as_continue = True,點擊保存並繼續編輯 save_as_continue = True # 如果 save_as=True,save_as_continue = True, 點擊Sava as new 按鈕后繼續編輯。 # 如果 save_as=True,save_as_continue = False,點擊Sava as new 按鈕后返回列表。 New in Django 1.10. 12. save_on_top = False,詳細頁面,在頁面上方是否也顯示保存刪除等按鈕 13. inlines,詳細頁面,如果有其他表和當前表做FK,那么詳細頁面可以進行動態增加和刪除 class UserInfoInline(admin.StackedInline): # TabularInline extra = 0 model = models.UserInfo class GroupAdminMode(admin.ModelAdmin): list_display = ('id', 'title',) inlines = [UserInfoInline, ] 14. action,列表時,定制action中的操作 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): # 定制Action行為具體方法 def func(self, request, queryset): print(self, request, queryset) print(request.POST.getlist('_selected_action')) func.short_description = "中文顯示自定義Actions" actions = [func, ] # Action選項都是在頁面上方顯示 actions_on_top = True # Action選項都是在頁面下方顯示 actions_on_bottom = False # 是否顯示選擇個數 actions_selection_counter = True 15. 定制HTML模板 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 16. raw_id_fields,詳細頁面,針對FK和M2M字段變成以Input框形式 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): raw_id_fields = ('FK字段', 'M2M字段',) 17. fields,詳細頁面時,顯示字段的字段 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): fields = ('user',) 18. exclude,詳細頁面時,排除的字段 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): exclude = ('user',) 19. readonly_fields,詳細頁面時,只讀字段 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): readonly_fields = ('user',) 20. 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'), }), ) 21. 詳細頁面時,M2M顯示時,數據移動選擇(方向:上下和左右) @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",) 22. ordering,列表時,數據排序規則 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): ordering = ('-id',) 或 def get_ordering(self, request): return ['-id', ] 23. view_on_site,編輯時,是否在頁面上顯示view on set view_on_site = False 或 def view_on_site(self, obj): return 'https://www.baidu.com' 24. radio_fields,詳細頁面時,使用radio顯示選項(FK默認使用select) radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL 25. show_full_result_count = True,列表時,模糊搜索后面顯示的數據個數樣式 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): # show_full_result_count = True # 1 result (12 total) # show_full_result_count = False # 1 result (Show all) search_fields = ('user',) 26. formfield_overrides = {},詳細頁面時,指定現實插件 from django.forms import widgets from django.utils.html import format_htm class MyTextarea(widgets.Widget): def __init__(self, attrs=None): # Use slightly better defaults than HTML's 20x2 box default_attrs = {'cols': '40', 'rows': '10'} if attrs: default_attrs.update(attrs) super(MyTextarea, self).__init__(default_attrs) def render(self, name, value, attrs=None): if value is None: value = '' final_attrs = self.build_attrs(attrs, name=name) return format_html('<textarea {}>\r\n{}</textarea>',final_attrs, value @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): formfield_overrides = { models.models.CharField: {'widget': MyTextarea}, } 27. prepopulated_fields = {},添加頁面,當在某字段填入值后,自動會將值填充到指定字段。 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): prepopulated_fields = {"email": ("user","pwd",)} PS: DjangoAdmin中使用js實現功能,頁面email字段的值會在輸入:user、pwd時自動填充 28. 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 29. 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 = "指定列數據為空時,默認顯示"
二. 字段和字段的參數
常用的字段
from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
AutoField 自增的整形字段, 必填 primary_key=True, 則成為數據庫的主鍵, 無該字段時, django自動創建, 一個model不能有兩個AutoField字段
integerField 一個整數類型, 數值的范圍是 -2147483648 ~ 2147483647
BooleanField 布爾值類型
CharField 字符類型, 必須提供max_length參數, max_length表示字符的長度
TextField 文本類型
DateTimeField 日期時間字段, 格式為 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當於Python中的datetime.datetime的實例。
DecimalField 十進制小數

AutoField(Field) - int自增列,必須填入參數 primary_key=True BigAutoField(AutoField) - bigint自增列,必須填入參數 primary_key=True 注:當model中如果沒有自增列,則自動會創建一個列名為id的列 from django.db import models class UserInfo(models.Model): # 自動創建一個列名為id的且為自增的整數列 username = models.CharField(max_length=32) class Group(models.Model): # 自定義自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整數 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整數 0 ~ 32767 IntegerField(Field) - 整數列(有符號的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整數 0 ~ 2147483647 BigIntegerField(IntegerField): - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) - 布爾值類型 NullBooleanField(Field): - 可以為空的布爾值 CharField(Field) - 字符類型 - 必須提供max_length參數, max_length表示字符長度 TextField(Field) - 文本類型 EmailField(CharField): - 字符串類型,Django Admin以及ModelForm中提供驗證機制 IPAddressField(Field) - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制 GenericIPAddressField(Field) - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6 - 參數: protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定為True,則輸入::ffff:192.0.2.1時候,可解析為192.0.2.1,開啟此功能,需要protocol="both" URLField(CharField) - 字符串類型,Django Admin以及ModelForm中提供驗證 URL SlugField(CharField) - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下划線、連接符(減號) CommaSeparatedIntegerField(CharField) - 字符串類型,格式必須為逗號分割的數字 UUIDField(Field) - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能 - 參數: path, 文件夾路徑 match=None, 正則匹配 recursive=False, 遞歸下面的文件夾 allow_files=True, 允許文件 allow_folders=False, 允許文件夾 FileField(Field) - 字符串,路徑保存在數據庫,文件上傳到指定目錄 - 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路徑保存在數據庫,文件上傳到指定目錄 - 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage width_field=None, 上傳圖片的高度保存的數據庫字段名(字符串) height_field=None 上傳圖片的寬度保存的數據庫字段名(字符串) DateTimeField(DateField) - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 時間格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值為datetime.timedelta類型 FloatField(Field) - 浮點型 DecimalField(Field) - 10進制小數 - 參數: max_digits,小數總長度 decimal_places,小數位長度 BinaryField(Field) - 二進制類型
三. 查詢的方法(13個)
返回對象是對象列表的: all(), filter(), exclude(), order_by(), reverse(), values(), values_list(), distinct()
返回結果是對象: get(), first(), last()
返回結果是布爾值: exists()
count(): 返回數字
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "course_select.settings.py") import django django.setup() from cou_sele import models models.Classes.objects.all() #獲取所有的數據 對象列表 models.Classes.objects.filter(id=1) #獲所有滿足條件的所有對象 models.Classes.objects.get(id=1) #獲取滿足條件的一個對象,沒有或者是多個報錯 models.Classes.objects.exclude(id=1) #獲所有不滿足條件的所有對象 models.Classes.objects.values('name','id') #[{},{}]1.不指定字段名,獲取對象的字段名和值名和值 2,指定字段名 獲取指定字段的名和值 models.Classes.objects.values_list() #[{},{}] 1.不指定字段名,獲取所有字段的值, 2.指定字段名,獲取指定字段值 models.Classes.objects.all().order_by('age','-id') #order_by 排序 默認升序,加 - 降序 指定多個進行排序 models.Classes.objects.all().order_by('age','-id').reverse()#給已經排好序的結果倒敘排序, 翻轉 models.Classes.objects.all().distinct()#去重 models.Classes.objects.all().count() #計數 models.Classes.objects.filter(id=100).first() #取第一個 models.Classes.objects.filter(id=1).last() #取最后一個 models.Classes.objects.filter(id=1).exists() #判斷數據是否存在
四. 單表的雙下划線
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings") import django django.setup() from app01 import models ret = models.Person.objects.filter(id=1) ret = models.Person.objects.filter(id__gt=1) # greater than 大於 ret = models.Person.objects.filter(id__gte=1) # greater than equal 大於等於 ret = models.Person.objects.filter(id__lt=3) # less than 小於 ret = models.Person.objects.filter(id__lte=3) # less than equal 小於等於 ret = models.Person.objects.filter(id__gt=1, id__lt=3) 大於1,小於3 ret = models.Person.objects.filter(id__range=[1, 3]) # 范圍 左右都包含 ret = models.Person.objects.filter(id__in=[1, 3]) # ret = models.Person.objects.filter(name__contains='alex') # 包含 like ret = models.Person.objects.filter(name__icontains='alex') # 包含 like ret = models.Person.objects.filter(name__startswith='a') # 以什么開頭 ret = models.Person.objects.filter(name__istartswith='a') # 以什么開頭 忽略大小寫 ret = models.Person.objects.filter(name__endswith='x') # 以什么結尾 ret = models.Person.objects.filter(name__iendswith='X') # 以什么結尾 忽略大小寫 ret = models.Person.objects.filter(birth__year=2018) ret = models.Person.objects.filter(birth__contains='2018-12')
五. 外鍵的操作
設置外鍵
from django.db import models class Classes(models.Model): cid = models.AutoField(primary_key=True) #設置主鍵 不為空且唯一 name = models.CharField(max_length=32,unique=True) #唯一 def __str__(self): return self.name class Student(models.Model): name = models.CharField(max_length=32, unique=True) classes = models.ForeignKey('Classes', on_delete=models.CASCADE) #設置外鍵, 關聯Classes
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings") import django django.setup() from cou_sele import models #基於對象的查詢 #正向 book_obj = models.Book.objects.get(id=1) book_obj.id #獲取id book_obj.publisher #關聯的對象 book_obj.publisher.id #關聯的對象的id #反向查詢 pub_obj = models.Publisher.objects.get(id=1) pub_obj.book_set.all() #查詢出出版社出版的所有書籍 #指定book表中, related_name='books' pub_obj.books.all() # 基於字段的查詢 ret = models.Book.objects.filter(publisher__name='xxx') # 不指定related_name ret = models.Publisher.objects.filter(book_title='XXX') # 指定related_name ret = models.Publisher.objects.filter(books_title='xxx') # 外鍵字段可以為null 才有remove和clear 只能寫對象 pub_obj = models.Publisher.objects.get(id=1) pub_obj.books.remove(models.Publisher.objects.get(id=1)) pub_obj.books.clrar()
六. 多對多的操作
models中創建多對多的關系
class Classes(models.Model): cid = models.AutoField(primary_key=True) #設置主鍵 不為空且唯一 name = models.CharField(max_length=32,unique=True) #唯一 def __str__(self): return self.name class Student(models.Model): name = models.CharField(max_length=32, unique=True) classes = models.ForeignKey('Classes', on_delete=models.CASCADE) #設置外鍵, 關聯Classes class Teacher(models.Model): name = models.CharField(max_length=32, unique=True) # 唯一 Student = models.ManyToManyField('Student')
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings") import django django.setup() from cou_sele import models #基於對象的查詢 #正向 author_obj = models.Author.objects.get(id=2) author_obj.books.all() #反向 book_obj = models.Book.objects.get(id=1) #不指定related_name='authors' book_obj.author_set.all() #指定related_name='authors' book_obj.authors.all() #set 設置多對多關系 author_obj.books.set([]) author_obj.books.set([1,2,3]) #要關聯對象的ID [ 對象的id,對象的id] author_obj.books.set(models.Book.objects.all()) # 要關聯對象 [ 對象,對象] # add 添加多對多的關系 author_obj.books.add(1) #要關聯對象的ID author_obj.books.add(models.Book.objects.get(id=2)) #要關聯的對象 #remove() 刪除多對多的關系 author_obj.books.remove(1) #關聯對象的ID author_obj.books.remove(models.Book.objects.get(id=2)) #關聯的對象 # clear() 清空當前對象的多對多的關系 author_obj.books.clear() # create() 創建 author_obj.books.create(title='xxx')