🐙

Djangoモデルとフォームの備忘録

2024/07/01に公開

DjangoのモデルとフォームのDatetime処理

モデルクラスとフォームクラスのDatetime処理での備忘録

モデルクラスでの作成日時と更新日時

class Hoge(models.Model):
    # 編集不可のフィールド
    created_at = models.DateTimeField(
        verbose_name='新規登録日時',
        auto_now_add=True
    )
    # 編集不可のフィールド
    modified_at = models.DateTimeField(
        verbose_name='更新日時',
        auto_now=True
    )

モデルクラスでの編集可能なDatetimeField

class Hoge2(models.Model):
    # 編集可のDatetimeフィールド
    date1 = models.DateTimeField(
        verbose_name="date1"
    )
    # 編集不可のフィールド
    date2 = models.DateTimeField(
        verbose_name="date2",
        auto_now=True
    )

ModelFormでの設定

モデル Hoge2 と連動するモデルフォームクラス Hoge2Form の作成。フィールド date1 の入力は type="datetime-local" にすることで、年月日時分を入力可能にする。秒は00秒で代入される

from .models import Hoge2
class Hoge2Form(forms.ModelForm):
    class Meta:
        model = Hoge2
        fields = ["date1"]
        widgets = {
            'date1' : forms.TextInput(attrs={'autofocus' : True, 'type' : 'datetime-local'}),
        }

ModelFormでモデルと連携しない個別のDatetimeフィールド

モデルクラス Hoge2 と連動するフォームを作成する。連動しているフィールドは「date1」のみ。モデルクラス Hoge2 と連動していないフィールド fuga を作成する。 fuga はモデルと関係ないフィールドで type="date" にする。年月日が入力可能になる

from .models import Hoge2
class Hoge2Form(forms.ModelForm):
    class Meta:
        model = Hoge2
        fields = ["date1"]
        widgets = {
            'date1' : forms.TextInput(attrs={'autofocus' : True, 'type' : 'datetime-local'}),
        }

    fuga = forms.CharField(
        label="fugaufuga",
        widget=forms.TextInput({"type": "date"}),
    )

View側でいくつかのパターン

いくつかのパターン

自動で入るパターン

auto_now_addとauto_nowのフィールドは編集不可で、逆に自動的に値を設定する

値をDatetimeオブジェクトで設定

クラスビューでモデルのDatetimeFieldに値を入力する。編集可のDatetimeFieldに任意の年月日時分秒を代入する。Datetimeオブジェクトを利用する。クラスビューの form_valid で値を代入する

    def form_valid(self, form):
        date_str = "2018-12-05 9:15:30+0900"
        date_obj = datetime.strptime(date_str,"%Y-%m-%d %H:%M:%S%z")        
        form.instance.date1 = date_obj
        return super().form_valid(form)

値を文字列で設定

クラスビューでモデルのDatetimeFieldに値を入力する。編集可のDatetimeFieldに任意の年月日時分秒を代入する。文字列を利用する。クラスビューの form_valid で値を代入する

    def form_valid(self, form):
        date_str = "2018-12-05 9:15:30+0900"
        form.instance.date1 = date_str
        return super().form_valid(form)

値をフォームクラスで設定

クラスビューでモデルのDatetimeFieldに値を入力する。モデルと連動しないフォームクラスのフィールドを作成して、そのフィールドに入力した「年月日」をモデルのDatetimeフィールドに代入する。「年月日」のみを設定する。時分秒は0が入る。クラスビューの form_valid で値を代入する

    def form_valid(self, form):    
        date_str = form.cleaned_data["fuga"]
        form.instance.date1 = date_str
        return super().form_valid(form)

Discussion