実務で躓いたポイントのうち、一つの記事に起こすまでもないものをまとめました。
【実務テクニック集】Djangoの豆知識
アプリをappsディレクトリにまとめる
まずは格納先のディレクトリを用意します。
ここではapps
の配下にuser
ディレクトリを作成しましょう。
mkdir -p 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,
)
上記を書き換えたらmakemigrations
とmigrate
コマンドでデータベースとして登録しておきましょう。
続いて管理画面に表示するため、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_NULL | nullにする |
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 %}
まとめ
記事は随時更新していきます。
コメント