Django內置的Admin是對於model中對應的數據表進行增刪改查提供的組件,使用方式有:python
Django Admin內部依賴:mysql
依賴APP:git
django.contrib.authsql
django.contrib.contenttypesdjango
django.contrib.messages瀏覽器
django.contrib.sessions服務器
模板的context_processors:session
django.contrib.auth.context_processors.authapp
django.contrib.messages.context_processors.messageside
中間件:
django.contrib.auth.middleware.AuthenticationMiddleware
django.contrib.messages.middleware.MessageMiddleware
一般咱們在生成項目時會在 urls.py 中自動設置好。
from django.contrib import adminfrom django.urls import path
urlpatterns = [
path('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/
在使用admin組件以前,須要將app下的模型類,進行註冊。
app下 models.py 文件:
from django.db import models class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) pub_date = models.DateField() publish = models.ForeignKey("Publish", on_delete=models.CASCADE) authors = models.ManyToManyField("Author") def __str__(self): return self.title class Publish(models.Model): name = models.CharField(max_length=32) city = models.CharField(max_length=64) email = models.EmailField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=32) age = models.SmallIntegerField() au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE) def __str__(self): return self.name class AuthorDetail(models.Model): gender_choices = ( (0, "女"), (1, "男"), (2, "保密"), ) gender = models.SmallIntegerField(choices=gender_choices) tel = models.CharField(max_length=32) addr = models.CharField(max_length=64) birthday = models.DateField()
啓動服務器,而後在瀏覽器中訪問 http://127.0.0.1:8000/admin/,獲得登陸界面。
你能夠經過命令 python manage.py createsuperuser 來建立超級用戶。而後,來進行登陸操做。
爲了讓 admin 界面管理某個數據模型,咱們須要先註冊該數據模型到 admin。
在admin.py中只須要將Mode中的某個類註冊,便可在Admin中實現增刪改查的功能,如:
admin.site.register(models.Book, )
admin.site.register(models.Publish, )
admin.site.register(models.Author, )
admin.site.register(models.AuthorDetail, )
登陸後顯示:
這時候就已經能夠進行數據的添加了。
可是,這種方式比較簡單,若是想要進行更多的定製操做,須要利用ModelAdmin進行操做。
咱們能夠自定製類繼承 admin.ModelAdmin 類,來擴展方法。有如下兩種方式註冊:
看下面的註冊方法請注意,類的命名是固定的:models中的類名+Admin ,請注意下面的格式。
# 方式一:(註冊book表)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'price', 'publish', 'pub_date')
admin.site.register(models.Book, BookAdmin)
# 方式二:(註冊publish表,並顯示字段)
@admin.register(models.Publish)
class PublishAdmin(admin.ModelAdmin):
list_display = ('name', 'city', 'email')
方式一效果圖:
能夠顯示這些列
方式二效果圖:
ModelAdmin中提供了大量的可定製功能,下面咱們列舉一下經常使用的功能:
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'price', 'publish', 'pub_date', 'show_author') # 定製展現的列
list_display_links = ('price',) # 定製跳轉的列
list_filter = ('publish', 'authors') # 定製過濾列
search_fields = ('title', 'price') # 定製模糊搜索列
list_editable = ('title',) # 定製能夠直接編輯的列
actions = ['patch_init'] # 定製批量處理方法
ordering = ['-price'] # 經過該列進行排序,默認升序
def show_author(self, obj): # 自定製展現列
return "|".join([i.name for i in obj.authors.all()])
def patch_init(self, request, queryset): # 初始化單價
queryset.update(price=100)
patch_init.short_description = "批量初始化" # 設置操做名稱
admin.site.register(models.Book, BookAdmin)
定製跳轉的列
點擊設置的跳轉列,進入後效果(能夠修改信息)
定製模糊搜索列(不能將關聯的字段加到模糊搜索中)
能夠經過模糊搜索,價格或出版社名:
定製能夠直接編輯的列
能夠直接進行修改(通常不這樣用)
定製批量處理方法
經過該列進行排序,默認升序
在admin模糊查詢中加到必定的字段,在查詢中文時,出現報錯:
(1271, "Illegal mix of collations for operation 'like'")
問題所在是:
MySQL Illegal mix of collations for operation 'like'
在 MySQL 5.5 以上, 若字段類型 Type 是 time,date,datetime
select時若是使用 like '%中文%' 會出現 Illegal mix of collations for operation 'like'
執行時可能就會出現時間字段 like '%中文%' 這種語法,舊版的 MySQL 是不會出現錯誤的.
升到 MySQL 5.5 以上, 必需改爲 like binary '%中文%' 便可避免出現錯誤.
解決方法:
進入:
C:\python\py\Lib\site-packages\django\db\backends\mysql\base.py
根據狀況查看本身相應的文件
C:\python\py 爲個人python環境安裝目錄
找到對應的db路徑下的base.py文件
'icontains': 'LIKE %s', 改成: 'icontains': 'LIKE BINARY %s',
重啓後模糊查詢中文能夠了: