\ ポイント最大11倍! /

【実務テクニック集】Djangoの豆知識

実務で躓いたポイントのうち、一つの記事に起こすまでもないものをまとめました。

【実務テクニック集】Djangoの豆知識

アプリをappsディレクトリにまとめる

まずは格納先のディレクトリを用意します。
ここではappsの配下にuserディレクトリを作成しましょう。

mkdir apps/user

さらに以下のコマンドを実行すれば、userディレクトリ内に新しいアプリが作成されます。

python manage.py startapp user apps/user

さらにapps.pyをいじります。
もともとnameは単にアプリ名のuserとなっています。今回はアプリをappsディレクトリ配下に配置していることから、apps.userに変更しておきます。

from django.apps import AppConfig


class UserConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apps.user'

最後に、Djangoプロジェクトに新しいアプリを追加したことをsettings.pyに伝えます。

INSTALLED_APPS = [
    'apps.user.apps.UserConfig',
]

アプリを個別にマイグレーションする場合は以下のコマンドになります。

python manage.py makemigrations user

appsは入れずに実行することに注意です。

Flake8をVSCodeに適用する

以下をsettings.jsonに追記します。

"python.linting.flake8Enabled": true,

djLintをVSCodeに適用する

以下をsettings.jsonに追記します。

"python.linting.djlintEnable": true,

モデルを管理画面に表示させる

まずは管理画面に表示させるモデルを作成します。
今回はサンプルとしてユーザー名のみを格納するシンプルなモデルを作成してみました。

from django.db import models


class User(models.Model):
    username = models.CharField(
        verbose_name="ユーザー名",
        max_length=100,
    )

上記を書き換えたらmakemigrationsmigrateコマンドでデータベースとして登録しておきましょう。

続いて管理画面に表示するため、admin.pyに以下のような感じで追加します。

from django.contrib import admin
from .models import User


class UserAdmin(admin.ModelAdmin):
    pass


admin.site.register(User, UserAdmin)

これでuserモデルが管理画面に表示されるようになります。

前に実行したrunserverが残っている時の停止方法

コンソール上で以下のコマンドを実行することで、前回実行して残ってしまったrunserverを止めることができます。

pkill -f runserver

djangoサーバーのプロセス名はrunserverなので、pkillコマンドで終了できます。

参考サイト

モデル編

ForeignKeyのon_delete

Foreingkeyにon_deleteオプションをつけることで、参照先が削除された場合の挙動をカスタマイズできます。

オプション説明
CASCADE参照元が消える
PROTECT参照元は残る
RESTRICTエラーを出す
SET_NULLnullにする
SET_DEFAULT初期値を設定する
SET()SETの引数に渡した値にする
DO_NOTHING何もしない

ビュー編

requestオブジェクトのプロパティ

# HTMLメソッドを取得
method = request.method

# HTMLヘッダを取得
html_header = request.META

# HTMLボディを取得
html_body = request.data

# GETリクエストのクエリパラメータ
get_method = request.GET

# POSTリクエストのクエリパラメータ
post_method = request.POST

# 送信されたデータを取得する
recieved_data = request.FILES

# クッキーを取得
cookies = request.COOKIES

# セッションにアクセス
session = request.session

# ユーザーオブジェクトを取得(認証されていない場合はAnonymousUserとなる)
user = request.user

Template Viewでモデルのデータを取り出す方法

urlpatternsでURLの交通整理をします。

urlpatterns = [
    path('', HomeView.as_view(), name='home'),
]

views.pyで以下のようなTemplateViewクラスを作成し、get_context_dataメソッドを作成しましょう。

class HomeView(TemplateView):
    template_name = "index.html"
    model = Blog

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['blogs'] = Blog.objects.all()
        return context

HTMLとしてレンダリングしたいモデルのデータをcontextという辞書に渡せば、該当のデータがHTMLに渡されます。(この場合はindex.htmlにcontextが渡されます)

<div>
    <h2 class="mb-3">ブログの記事一覧</h2>
    {% for blog in blogs %}
        <h3>{{ blog.title }}</h3>
        <p>{{ blog.body }}</p>
    {% endfor %}
</div>

上記はBlogモデルにtitle, bodyフィールドを設定していた場合の例です。
これでHTML上に描画されているのが確認できると思います。

HTML編

URLテキストをリンクとして描画する

テキストの中でURLがあれば、リンクに変換する。

{{ object.text | urlize }}

改行に意味を持たせる

1度の改行は<br>タグに、2度の改行は<p>タグに変換する。

{{ object.text | linebreaks }}

現在の「年」を表示させる

current_yearという変数に現在の「年」を入れ、それをHTML上に描画します。

{% now "Y" as current_year %}
{% blocktranslate %}Copyright {{ current_year }}{% endblocktranslate %}

参考サイト: Django Built-in template tags and filters

ループ

{% for user in user_list %}
    <li>{{ user }}</li>
{% endfor %}

まとめ

記事は随時更新していきます。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Python(Django)が得意。最近ではフロント側の技術に触れる機会も増えてきました。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)