2024年7月31日水曜日

Django: プロジェクト全体でテンプレートタグを使いたい

以下のような構成とします。

/myproject
/myproject/myproject
/myproject/myapp
/myproject/templates
/myproject/templatetags/__init__.py
/myproject/templatetags/custom_tags.py

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], #/myproject/templates
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'libraries': {
                'custom_tags': 'templatetags.custom_tags', #myproject/myproject以下にしたい場合はmyproject.templatetags.custom_tags とすればよい
            }
        },
    },
]

テンプレートの方で {% load custom_tags %} とすれば、自作テンプレートタグがプロジェクトで共用できるようになる。

2024年7月4日木曜日

MySQL プライマリキーのインクリメントをリセットする

MySQLでは、以下の手順でincrementを1に初期化できます。

MySQLのDBに接続して以下のalterコマンドを実行します。


$ use <データベース名>;

$ alter table <テーブル名> auto_increment = 1;


auto_increment = 10にすると、10から始まります。


参考 Djangoノウハウ集【データベース操作編】
https://sinyblog.com/django/knowledge/


Django: 今日の日付 datetime.date.today() が1日前になってしまう

settings.py で、タイムゾーン設定 USE_TZ が True になっている場合、DjangoはデフォルトでUTCを使用します。このため、表示時に適切なタイムゾーンに変換する必要があります。

Djangoのタイムゾーン設定を確認する:

# settings.py
USE_TZ = True  # タイムゾーン対応を有効にする
TIME_ZONE = 'Asia/Tokyo'  # サーバーのデフォルトタイムゾーンを設定する


ビューでのタイムゾーン変換:
Djangoのビューで、datetime.date.today()を使う場合は、タイムゾーンを考慮して今日の日付を取得します。

from django.utils import timezone
from datetime import date

def get_today_date():
    # 現在のタイムゾーンを取得
    current_tz = timezone.get_current_timezone()
    # 現在の日付と時刻を取得し、タイムゾーンを設定
    now = timezone.now().astimezone(current_tz)
    # 現在の日付を返す
    return now.date()

テンプレートでの表示:
Djangoのテンプレートで日付を表示する際には、タイムゾーンを考慮して表示します。

<!-- テンプレートファイル (例: my_template.html) -->
{% load tz %}

{% get_current_timezone as TIME_ZONE %}
{% localtime on %}
    <p>今日の日付: {{ today }}</p>
{% localtime off %}

2024年7月1日月曜日

Django: フォームのウィジエットテンプレート上書き

フォームのウィジェットテンプレートをDjangoアプリのテンプレートで上書きしたいとき
settings.py に以下の追加1、追加2部分が必要

INSTALLED_APPS = [
    'app.apps.AppConfig',  # マイアプリケーション
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.forms',  # 追加1
]

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' # 追加2
例: 以下のようにアプリ下のtemplatesにデフォルトのウィジェットテンプレートを保存する場合
/myproject/app_name/templates/django/forms/widgets/select_option.html