🐙
DjangoのモデルとフォームのDatetime処理
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