Django Admin管理入門


Django最強大的部分之一是自動管理界面。它從模型中讀取元數據,以提供快速,以模型為中心的界面,受信任的用戶可以在其中管理您網站上的內容。管理員的推薦用途僅限於組織的內部管理工具。它不是用於構建整個前端。

管理員有許多用於自定義的鈎子,但要注意嘗試專門使用這些鈎子。如果您需要提供一個更加以流程為中心的接口來抽象出數據庫表和字段的實現細節,那么可能是時候編寫自己的視圖了。

1 創建Django項目

django-admin startproject crm_v1

2 創建並注冊app

python manage.py  startapp  bms

修改settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    ......
    'bms.apps.BmsConfig',
]

3  創建模型 modles.py

在 Django 里寫一個數據庫驅動的 Web 應用的第一步是定義模型 - 也就是數據庫結構設計和附加的其它元數據。

設計哲學

模型是真實數據的簡單明確的描述。它包含了儲存的數據所必要的字段和行為。Django 遵循 DRY Principle 。它的目標是你只需要定義數據模型,然后其它的雜七雜八代碼你都不用關心,它們會自動從模型生成。

來介紹一下遷移 - 舉個例子,不像 Ruby On Rails,Django 的遷移代碼是由你的模型文件自動生成的,它本質上只是個歷史記錄,Django 可以用它來進行數據庫的滾動更新,通過這種方式使其能夠和當前的模型匹配。

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

4 數據庫操作

為模型的改變生成遷移文件

python manage.py makemigrations 

應用用數據庫遷移

python manage.py migrate 

數據庫遷移被分解成生成和應用兩個命令是為了讓你能夠在代碼控制系統上提交遷移數據並使其能在多個應用里使用;這不僅僅會讓開發更加簡單,也給別的開發者和生產環境中的使用帶來方便。

5 激活管理工具

通常我們在生成項目時會在 urls.py 中自動設置好,

from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),]

6 創建超級用戶

python manage.py createsuperuser

7 使用管理工具

啟動Django項目

輸入url:http://127.0.0.1:8000/admin

即可看到登錄頁面,輸入剛才創建的用戶名和密碼進行登錄

登錄成功后可以看到如下頁面

 

admin的定制

1 注冊類 

在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中即可看到

2 添加數據

通過點擊add分別給author,book ,publish 添加數據

再創建書籍是可以看到一件有了出版社和作者的選擇

3 查看book表數據

可以看到只要書籍名稱,沒有作者、價格、出版社等信息

4 定制列,顯示更多的字段信息

需要利用ModelAdmin進行操作

class BookInfo(admin.ModelAdmin):
    list_display = ['title', 'price', 'publish'] 
   # list_displey 中的字段必須是和數據庫中有的
admin.site.register(Book, BookInfo)

可以看到已經多了兩列信息

5  顯示多對多字段----author(作者姓名)

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)

6 list_filter,列表時,定制右側快速篩選。

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)

7 search_fields 列表,模糊搜索的功能

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)

8 自定義active

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

 

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

設置根據id,價格排序,也可反向排序 return ['-title', 'price'] 

class BookInfo(admin.ModelAdmin):
    ......
    def get_ordering(self, request):
        return ['title', 'price'] 

點擊title列或者price列即可進行排序

 

10 設置admin后台為中文顯示

 修改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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM