ホームページ  >  記事  >  バックエンド開発  >  Django フレームワークにおけるバックエンド管理システムのスキル (パート 2)

Django フレームワークにおけるバックエンド管理システムのスキル (パート 2)

王林
王林オリジナル
2023-06-17 19:09:08867ブラウズ

Django フレームワークのバックエンド管理システム スキル (パート 2)

前の記事では、背景ページのレイアウトをカスタマイズする方法、カスタムフィルター、アクションのカスタマイズ方法など。この記事では、Django フレームワークをより効果的に使用するための、より実践的なヒントを引き続き紹介していきます。

  1. モデルでのForeignKeyのデフォルト値の扱い方

Djangoモデルでは、ForeignKeyは非常に実用的なフィールド型です。ただし、新しい Model インスタンスを作成する場合、正常に保存するには、ForeignKey タイプ フィールドに関連する Model のインスタンスを指定する必要があります。指定しない場合はデフォルトでNULL値が保存されます。場合によっては、ForeignKey タイプのフィールドをデフォルトの関連付けインスタンスに保存したい場合がありますが、この場合は、Django の get_or_create メソッドを使用できます。

たとえば、Product Model があり、それに ProductCategoryForeignKey フィールドを定義しているとします。新しい Product インスタンスを作成すると、デフォルトの Category インスタンスが自動的に関連付けられることを期待しています。次のコードをモデル:

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. バックグラウンド管理システムでモデルがインスタンスを 1 つだけ作成するように制限する方法

場合によっては、次のようなモデルでインスタンスを 1 つだけ作成したい場合があります。 Web サイトのグローバル設定で。現時点では、Django の SingletonModel ライブラリを使用できます。このライブラリは、任意のモデルをシングルトン モデルに簡単に変換できる BaseSingletonModel を提供します。

たとえば、GlobalSettings モデルがあり、インスタンスを 1 つだけ作成できることを期待しています。これは次のように定義できます:

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 フレームワークでは、ミドルウェアはリクエストと応答を処理するために使用されるインターセプターです。リクエストがビュー関数に到達する前、ビュー関数がリクエストを処理した後、および応答がクライアントに送信される前に、リクエストまたは応答を処理できます。その中で、バックグラウンド管理システムにカスタムミドルウェアを追加することで、管理者の操作を簡単に傍受して処理することができます。

たとえば、管理者が特定の変更操作を行うときに 2 番目の確認パスワードを入力するようにしたい場合は、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

上記のコードでは、リクエストが表示関数に到達する前にリクエストをインターセプトし、2 番目の確認パスワードが必要かどうかを判断する confirmPasswordMiddleware を定義しています。 CONFIRMED_ACTIONS は、二次確認が必要なビュー関数のリストです。必要に応じて追加または削除できます。 view 関数では、現在のユーザーが request.session.get('password_confirmed', False) を通じて 2 番目の確認パスワードを入力したかどうかをクエリできます。

  1. バックグラウンド管理システムのモデルにシリアライザーを追加する方法

Django フレームワークでは、シリアライザーはモデルを辞書または JSON に変換するために使用されるクラスです。フォーマット。バックエンド管理システムにシリアライザーを追加すると、モデルを簡単に JSON 形式に変換して出力できるようになります。

たとえば、製品モデルがあり、それを 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)

上記のコードでは、現在選択されているModelインスタンスをJSON形式に変換してクライアントに出力できるexport_as_json関数が提供されています。同時に、ProductAdmin に my_view 関数も追加しました。この関数は、すべての Model インスタンスを直接クエリして、JSON 形式の出力に変換できます。

概要

Django フレームワークのバックグラウンド管理システムは、Web アプリケーションを開発するための重要なツールです。モデル インスタンス、バッチ変更、削除を簡単に管理できる既製の機能が多数提供されています。 。この記事では、モデル内のForeignKeyのデフォルト値を処理する方法、バックエンド管理システム内のモデルを1つのインスタンスのみ作成するように制限する方法、インスタンスを追加する方法など、Djangoフレームワークのバックエンド管理システムに関する実用的なヒントをいくつか紹介します。バックエンド管理システムのカスタマイズミドルウェアを定義し、バックエンド管理システムのモデルにシリアライザーを追加する方法を定義します。これらの手法を使用すると、Django フレームワークのバックグラウンド管理システムをより適切に使用できるようになります。

以上がDjango フレームワークにおけるバックエンド管理システムのスキル (パート 2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。