【django】プラグイン開発の応用テクニック:カスタム管理画面やapi拡張を実現しよう

カスタム管理画面の作成と拡張

こんにちは。今回は、djangoについて初心者エンジニアに向けて、プラグイン開発の応用テクニックについてご紹介します。

djangoは、pythonで開発された人気のあるwebアプリケーションフレームワークであり、多くのウェブサイトやアプリケーションの開発に利用されています。djangoの強力な機能の1つに、管理画面のカスタマイズや拡張があります。この機能を使うことで、データベースのモデルの操作や表示方法をカスタマイズできるだけでなく、独自のapiエンドポイントを追加することも可能です。

djangoの管理画面は、デフォルトではシンプルな操作性がありますが、特定の要件やデザインに合わせてカスタマイズすることもできます。例えば、自分のアプリケーションに関連するモデルだけを表示する、特定のフィールドを非表示にする、フィールドの値を変換して表示する、などのカスタマイズが可能です。

以下では、実際のコードを用いてカスタム管理画面の作成と拡張の手法をご紹介していきます。

django管理画面のカスタムモデル表示とフィールド設定

まず、管理画面のカスタムモデル表示とフィールド設定について見ていきましょう。djangoの管理画面では、admin.pyというファイルを作成し、管理するモデルクラスを登録することで、モデルの一覧や詳細ビューが表示されるようになります。

例えば、以下のようなmodels.pyファイルがあるとします。

from django.db import models

class book(models.model):
    title = models.charfield(max_length=100)
    author = models.charfield(max_length=100)
    publication_date = models.datefield()

この場合、admin.pyファイルに以下のように記述することで、管理画面での表示や操作方法をカスタマイズすることができます。

from django.contrib import admin
from .models import book

class bookadmin(admin.modeladmin):
    list_display = ('title', 'author', 'publication_date')

admin.site.register(book, bookadmin)

上記の例では、bookモデルを管理画面に登録し、表示するフィールドとしてtitleauthorpublication_dateを指定しています。これにより、管理画面での一覧ビューおよび詳細ビューに指定したフィールドが表示されるようになります。

管理画面のアクションとフィルタのカスタマイズ

次に、管理画面のアクションとフィルタのカスタマイズについて見ていきましょう。djangoの管理画面では、データベースのモデルに対して一括で操作を行うためのアクションや、絞り込んで表示するためのフィルタを設定することができます。

例えば、以下のようなadmin.pyファイルがあるとします。

from django.contrib import admin
from .models import book

class bookadmin(admin.modeladmin):
    list_display = ('title', 'author', 'publication_date')
    list_filter = ['author']
    actions = ['publish_books']

    def publish_books(self, request, queryset):
        queryset.update(published=true)

admin.site.register(book, bookadmin)

上記の例では、bookモデルの詳細ビューにtitleauthorpublication_dateのフィールドが表示されるだけでなく、authorを基準にフィルタをかけることができます。

また、actionsパラメータにpublish_booksというアクションを追加し、選択された書籍のpublishedフィールドをtrueに更新することができます。

管理画面の外観とテーマの変更方法

次に、管理画面の外観とテーマの変更方法について見ていきましょう。djangoの管理画面では、デフォルトの外観をカスタマイズするだけでなく、独自のテーマを適用することもできます。

例えば、以下のようなadmin.pyファイルがあるとします。

from django.contrib import admin
from .models import book

class customadminsite(admin.adminsite):
    def get_urls(self):
        from django.urls import path
        urls = super().get_urls()
        urls += [
            path('my_custom_view/', self.admin_view(self.my_custom_view))
        ]
        return urls

    def my_custom_view(self, request):
        # 独自のビューを定義する処理
        pass

custom_site = customadminsite(name='custom_admin')
custom_site.register(book)

admin.site = custom_site

上記の例では、adminsiteクラスを継承したcustomadminsiteクラスを作成し、get_urlsメソッドをオーバーライドして、独自のビューを追加することができます。

また、adminsiteクラスのサブクラスを作成することで、テーマをカスタマイズすることもできます。例えば、以下のようにcustomadminsiteクラスを作成して、デフォルトのテーマをカスタマイズすることができます。

from django.contrib import admin
from django.contrib.admin.sites import adminsite
from myapp.models import book

class customadminsite(adminsite):
    site_title = 'my custom admin'
    site_header = 'my custom admin'
    index_title = 'welcome to my custom admin'
    site_url = '/my_custom_admin/'

custom_admin_site = customadminsite(name='custom_admin')
custom_admin_site.register(book)

admin.site = custom_admin_site

上記の例では、customadminsiteクラスを作成し、site_titlesite_headerindex_titlesite_urlなどのプロパティをオーバーライドして、管理画面のテーマをカスタマイズしています。

django rest frameworkを使用したapiの拡張

次に、django rest frameworkを使用したapiの拡張について見ていきましょう。django rest frameworkを使うことで、djangoの管理画面に加えて独自のapiエンドポイントを作成することができます。

例えば、以下のようなviews.pyファイルがあるとします。

from rest_framework import viewsets
from .serializers import bookserializer
from .models import book

class bookviewset(viewsets.modelviewset):
    queryset = book.objects.all()
    serializer_class = bookserializer

上記の例では、rest_frameworkモジュールを使って、bookモデルに対するapiエンドポイントを作成しています。modelviewsetクラスを継承したbookviewsetクラスでは、querysetにモデルのデータを指定し、serializer_classにシリアライザのクラスを指定しています。

次に、以下のようなserializers.pyファイルを作成します。

from rest_framework import serializers
from .models import book

class bookserializer(serializers.modelserializer):
    class meta:
        model = book
        fields = ('title', 'author', 'publication_date')

上記の例では、bookモデルに対するシリアライザのクラスを定義しています。metaクラスのmodelにモデルクラスを、fieldsに表示させるフィールドを指定しています。

最後に、以下のようなurls.pyファイルを作成します。

from django.urls import include, path
from rest_framework import routers
from .views import bookviewset

router = routers.defaultrouter()
router.register(r'books', bookviewset)

urlpatterns = [
    path('', include(router.urls))
]

上記の例では、routersモジュールを使ってルーターを作成し、bookviewsetbooksというパスに登録しています。これにより、/books/にアクセスすると、bookモデルのデータを表示するapiエンドポイントが利用できるようになります。

カスタムapiエンドポイントの作成と認証の実装

最後に、カスタムapiエンドポイントの作成と認証の実装について見ていきましょう。djangoでは、独自のapiエンドポイントを簡単に作成することができます。

例えば、以下のようなviews.pyファイルがあるとします。

from django.http import jsonresponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def custom_api_view(request):
    if request.method == 'get':
        data = {
            'message': 'hello, world!'
        }
        return jsonresponse(data)

上記の例では、custom_api_viewという関数ベースのapiビューを作成しています。csrf_exemptデコレータを使うことで、csrfトークンの検証を無効化しています。getメソッドでアクセスされた場合には、messageというキーでhello, world!というテキストを返すようにしています。

このように、djangoを使うことで簡単にカスタム管理画面やapi拡張を実現することができます。初心者の方でも、djangoの強力な機能を活用して、自分のアプリケーションをさらにパワーアップさせましょう。

それでは、本記事を参考にしてdjangoのプラグイン開発の応用テクニックを活用してみてください。

参考記事:

 

【Django】関連のまとめ

Django 関連のまとめ
【django】pythonでwebアプリケーションを開発するためのフレームワーク   【django】インストール方法と基本的な使い方   【django】mvcパターンを理解する:model, view, controllerとは?  ...

 

オンラインスクールを講師として活用する!

【完全無料】使えるプログラミングスクール体験セミナー
【完全無料】使えるプログラミングスクール体験セミナー WEB制作の無料教材がここにきてどんどん増えてきてるので、使えるものをまとめようと思います。 TecAcademy(テックアカデミー) TechAcademyの無料体験 Samurai ...

 

0円でプログラミングを学ぶという選択

タイトルとURLをコピーしました