搜尋
首頁後端開發Python教學Django框架中的後台管理系統技巧(第二部分)

Django框架中的後台管理系統技巧(第二部分)

Jun 17, 2023 pm 07:09 PM
技巧django後台管理

Django框架中的後台管理系統技巧(第二部分)

在上一篇文章中,我們介紹了一些Django框架後台管理系統的技巧,例如如何自訂後台頁面佈局、如何自訂過濾器、如何自訂action等。這篇文章將繼續介紹更多實用的技巧,幫助您更好地使用Django框架。

  1. 如何處理Model中ForeignKey的預設值

在Django Model中,ForeignKey是非常實用的一個欄位類型。然而,當我們在建立一個新的Model實例時,ForeignKey類型的欄位需要指定一個相關Model的實例才能保存成功。如果沒有指定,預設會儲存NULL值。而有些情況下,我們可能希望ForeignKey類型的欄位保存在一個預設的關聯實例中,這時候就可以使用Django的get_or_create方法。

例如,我們有一個Product Model,並為其定義一個ProductCategory ForeignKey字段,我們希望當我們創建一個新的Product實例時,自動關聯一個預設的Category實例,可以在Model中加入以下程式碼:

class Product(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(ProductCategory, default=get_default_category)

   def get_default_category():
        """
        返回默认的ProductCategory实例或者创建一个新的实例
        """
        category, _ = ProductCategory.objects.get_or_create(name='Default Category')
        return category

這樣,當我們建立一個新的Product實例時,預設就會自動關聯一個名為"Default Category"的ProductCategory實例。

  1. 如何限制後台管理系統中一個Model只能建立一個實例

#有些情況下,我們可能會想要一個Model只能建立一個實例,例如網站中的全域設定。這時候可以使用Django的SingletonModel函式庫,它提供了一個BaseSingletonModel,讓我們可以輕鬆地將任何Model轉換為Singleton Model。

例如,我們有一個GlobalSettings Model,希望它只能建立一個實例,可以這樣定義:

from singleton_models.models import SingletonModel

class GlobalSettings(SingletonModel):
    site_name = models.CharField(max_length=100, default='')
    site_url = models.URLField(default='')
    # 其他全局设置字段

定義好了以後,在後台管理系統中,我們只能建立和編輯一個GlobalSettings實例。

  1. 如何為後台管理系統新增自訂中間件

在Django框架中,中間件是一個用來處理請求和回應的攔截器。它可以在請求到達視圖函數之前、視圖函數處理請求之後和回應傳送給客戶端之前對請求或回應進行處理。其中,在後台管理系統中新增自訂中間件,可以讓我們輕鬆地對管理員的操作進行攔截和處理。

例如,我們希望在管理員進行某些修改操作時,需要輸入二次確認密碼,可以在Django專案的settings.py檔案中加入以下程式碼:

MIDDLEWARE = [
    # 默认的中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    # 自定义中间件
    'myapp.middleware.ConfirmPasswordMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CONFIRMED_ACTIONS = (
    'myapp.views.EditProductView',
    'myapp.views.DeleteProductView',
)

class ConfirmPasswordMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 根据请求的URL判断是哪个视图函数,如果是CONFIRMED_ACTIONS中的视图函数,需要做二次确认
        view_func = resolve(request.path_info).func
        if view_func and view_func.__module__ + "." + view_func.__name__ in CONFIRMED_ACTIONS:
            if not request.session.get('password_confirmed', False):
                # 没有输入二次确认密码,跳转到输入页面
                return redirect(reverse('confirm-password'))

        response = self.get_response(request)

        return response

以上程式碼中,我們定義了一個ConfirmPasswordMiddleware,它會在請求到達視圖函數之前對請求進行攔截並判斷是否需要輸入二次確認密碼。 CONFIRMED_ACTIONS是一個需要進行二次確認的視圖函數列表,我們可以根據需要進行新增或刪除。在視圖函數中,我們可以透過request.session.get('password_confirmed', False)查詢目前使用者是否已經輸入了二次確認密碼。

  1. 如何為後台管理系統的Model新增序列化器

在Django框架中,Serializer是一個用於將Model轉換為字典或JSON格式的類別。在後台管理系統中加入序列化器,可以讓我們輕鬆地將Model轉換為JSON格式並輸出。

例如,我們有一個Product Model,希望將它轉換為JSON格式,並在後台管理系統中輸出,可以這樣定義:

from django.contrib import admin
from django.core.serializers import serialize
from django.http import HttpResponse

class ProductAdmin(admin.ModelAdmin):
    # 列表视图显示的字段列表
    list_display = ('name', 'price', 'category')

    # 自定义action函数
    def export_as_json(self, request, queryset):
        response = HttpResponse(content_type="application/json")
        serializers.serialize("json", queryset, stream=response)
        return response
    export_as_json.short_description = "导出为JSON"

    # 自定义函数按钮
    change_list_template = 'admin/myapp/product/list.html'

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('my_view/', self.my_view),
        ]
        return my_urls + urls

    def my_view(self, request):
        data = serialize('json', Product.objects.all())
        return JsonResponse(data, safe=False)

admin.site.register(Product, ProductAdmin)

在以上程式碼中,我們為ProductAdmin添加了一個export_as_json函數,它可以將目前選取的Model實例轉換為JSON格式並輸出給客戶端。同時,我們也為ProductAdmin新增了一個my_view函數,它可以直接查詢所有的Model實例並將它們轉換為JSON格式輸出。

總結

Django框架的後台管理系統是開發網路應用程式的重要工具,它提供了許多現成的功能,可以讓我們輕鬆地管理Model實例,批量修改和刪除。在本篇文章中,我們介紹了一些Django框架後台管理系統的實用技巧,包括如何處理Model中ForeignKey的預設值、如何限制後台管理系統中一個Model只能建立一個實例、如何為後台管理系統添加自定義中間件、如何為背景管理系統的Model新增序列化器。透過這些技巧的使用,可以讓我們更好地使用Django框架的後台管理系統。

以上是Django框架中的後台管理系統技巧(第二部分)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python:遊戲,Guis等Python:遊戲,Guis等Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Apr 02, 2025 am 07:12 AM

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器