Django最強大的部分之一是自動管理界面。它從模型中讀取元數據,以提供快速,以模型爲中心的界面,受信任的用戶能夠在其中管理您網站上的內容。管理員的推薦用途僅限於組織的內部管理工具。它不是用於構建整個前端。html
管理員有許多用於自定義的鉤子,但要注意嘗試專門使用這些鉤子。若是您須要提供一個更加以流程爲中心的接口來抽象出數據庫表和字段的實現細節,那麼多是時候編寫本身的視圖了。前端
django-admin startproject crm_v1
python manage.py startapp bms
修改settings.pypython
INSTALLED_APPS = [ 'django.contrib.admin', ...... 'bms.apps.BmsConfig', ]
在 Django 裏寫一個數據庫驅動的 Web 應用的第一步是定義模型 - 也就是數據庫結構設計和附加的其它元數據。git
設計哲學數據庫
模型是真實數據的簡單明確的描述。它包含了儲存的數據所必要的字段和行爲。Django 遵循 DRY Principle 。它的目標是你只須要定義數據模型,而後其它的雜七雜八代碼你都不用關心,它們會自動從模型生成。django
來介紹一下遷移 - 舉個例子,不像 Ruby On Rails,Django 的遷移代碼是由你的模型文件自動生成的,它本質上只是個歷史記錄,Django 能夠用它來進行數據庫的滾動更新,經過這種方式使其可以和當前的模型匹配。app
from django.db import models class Publish(models.Model): name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=16) age = models.IntegerField() def __str__(self): return self.name class Book(models.Model): title = models.CharField(max_length=32) publish = models.ForeignKey(to="Publish", on_delete=models.CASCADE) pub_date = models.DateField() price = models.DecimalField(max_digits=6, decimal_places=2) author = models.ManyToManyField(to="Author") state = models.IntegerField(choices=[(1, "已出版"), (2, "未出版")], default=1) def __str__(self): return self.title
爲模型的改變生成遷移文件工具
python manage.py makemigrations
應用用數據庫遷移網站
python manage.py migrate
數據庫遷移被分解成生成和應用兩個命令是爲了讓你可以在代碼控制系統上提交遷移數據並使其能在多個應用裏使用;這不單單會讓開發更加簡單,也給別的開發者和生產環境中的使用帶來方便。url
一般咱們在生成項目時會在 urls.py 中自動設置好,
from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls),]
python manage.py createsuperuser
啓動Django項目
輸入url:http://127.0.0.1:8000/admin
便可看到登陸頁面,輸入剛纔建立的用戶名和密碼進行登陸
登陸成功後能夠看到以下頁面
在admin.py中只須要將Mode中的某個類註冊,便可在Admin中實現增刪改查的功能
from django.contrib import admin
from django.contrib import adminfrom bms.models import Book,Publish,Author,AuthorDetail
admin.site.register(Book)
admin.site.register(Publish)
admin.site.register(Author)
以上是註冊Book,Publilsh, Author類,在admin中便可看到
經過點擊add分別給author,book ,publish 添加數據
再建立書籍是能夠看到一件有了出版社和做者的選擇
能夠看到只要書籍名稱,沒有做者、價格、出版社等信息
須要利用ModelAdmin進行操做
class BookInfo(admin.ModelAdmin): list_display = ['title', 'price', 'publish'] # list_displey 中的字段必須是和數據庫中有的 admin.site.register(Book, BookInfo)
能夠看到已經多了兩列信息
class BookInfo(admin.ModelAdmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()])
list_display = ['title', "show_author", 'price', 'publish', 'state']
admin.site.register(Book, BookInfo)
class BookInfo(admin.ModelAdmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()]) list_display = ['title', "show_author", 'price', 'publish', 'state'] list_filter = ['publish', 'author'] # 列表中寫篩選的字段 admin.site.register(Book, BookInfo)
class BookInfo(admin.ModelAdmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()]) list_display = ['title', "show_author", 'price', 'publish', 'state'] list_filter = ['publish', 'author'] search_fields = ['author__name', 'price', 'title', 'publish__name'] # 因爲 author是多對的字段,publish是外鍵,故不能直接寫字段名,必須跨表查看 admin.site.register(Book, BookInfo)
class BookInfo(admin.ModelAdmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()]) list_display = ['title', "show_author", 'price', 'publish', 'state'] list_filter = ['publish', 'author'] search_fields = ['author__name', 'price', 'title', 'publish__name'] def func(self, request, queryset): print(self, request, queryset) print(request.POST.getlist("_selected_action")) def price_to_zero(self, request, queryset): queryset.update(price=0) # 把選擇的價格都設置爲0 func.short_description = "自定義action動做" price_to_zero.short_description = "價格初始化" # 設置在action下拉菜單中顯示的信息 actions = [func, price_to_zero] # 把自定義的兩個方法添加到actions中
# Action選項都是在頁面上方顯示
actions_on_top = True
# Action選項都是在頁面下方顯示
actions_on_bottom = False
admin.site.register(Book, BookInfo)
(1)選擇剛纔定義的action動做
能夠看到後臺的輸出
(2)執行價格初始化動做
結果以下,能夠看到價格已經設置爲0
設置根據id,價格排序,也可反向排序 return ['-title', 'price']
class BookInfo(admin.ModelAdmin): ...... def get_ordering(self, request): return ['title', 'price']
點擊title列或者price列便可進行排序
修改settings.py文件
將LANGUAGE_CODE = 'en-us'改成
LANGUAGE_CODE = 'zh-hans'
也可設置表的字段爲中文,加上 verbose_name選項便可。
class Book(models.Model): title = models.CharField(max_length=32,verbose_name="書名") publish = models.ForeignKey(to="Publish", on_delete=models.CASCADE,verbose_name="出版社") pub_date = models.DateField(verbose_name="出版日期") price = models.DecimalField(max_digits=6, decimal_places=2,verbose_name="價格") author = models.ManyToManyField(to="Author",verbose_name="做者") state = models.IntegerField(choices=[(1, "已出版"), (2, "未出版")], default=1,verbose_name="狀態") def __str__(self): return self.title
效果以下:
SHOW AUTHOR仍是英語的,如今來改一下
class BookInfo(admin.ModelAdmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()]) show_author.short_description = "做者"
short_description 設置字段的描述信息
最終結果如圖
其餘設置可參考 : https://www.cnblogs.com/yuanchenqi/articles/8323452.html