以下のModelFormクラスがあります。djangoのクリーンメソッドでクリーンなデータにキーがありません
from django.forms import ModelForm
from tenant.models import EventsModel
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from django import forms
class EventsForm(ModelForm):
class Meta:
model = EventsModel
fields = '__all__'
def clean_start_date_time(self):
# can not be before than now.
data = self.cleaned_data
print(data)
start_date_time = data.get("start_date_time")
now_date_time = timezone.now()
if start_date_time < now_date_time:
raise forms.ValidationError(
_('Start time has passed.'),
code='invalid',
)
return data
def clean(self):
# end date can not be before or equal to start date time
# data = super(EventsForm, self).clean()
data = self.cleaned_data
print(data)
start_date_time = data.get("start_date_time")
end_date_time = data.get("end_date_time")
if start_date_time >= end_date_time:
raise forms.ValidationError(
_('End time should be after start time.'),
code='invalid',
)
clean_start_date_time
start_date_time
が過去にあるため、エラーが発生しました。 start_date_time
はclean_start_date_time
メソッドで利用可能ですが、clean
メソッドでは利用できません。 なぜこれが起こっていますか?
どちらの方法でもクリーニングされたデータを印刷しましたが、クリーニングされたデータに違いがあります。 この違いはなぜですか? clean_start_date_time
で
クリーンデータ:
{'tenant_sys_id': None, 'name': 'dfghj', 'start_date_time': datetime.datetime(2016, 12, 21, 13, 20, 23)}
clean
でデータをきれい:
{'created_by': None, 'last_updated_when': None, 'last_updated_by': None, 'tenant_sys_id': None, 'notes': 'g', 'name': 'dfghj', 'created_when': None, 'end_date_time': datetime.datetime(2016, 12, 31, 14, 20, 29)}
POSTデータにstart_date_timeが存在します。 clean_start_date_timeにも存在します。しかし、清潔な方法でのみ存在しません。 – User42
はい、私が与えた理由のために。これは*予想される動作*です。 –
ポイントを得ました。 clean_start_date_timeがエラーを発生させている場合、それ以降はclean_start_date_timeがクリーンデータに存在しません。この特定のシナリオでは、ユーザーが最初のエラーを修正するまで、2番目のエラーは表示されません。ボットエラーがスローされるような方法でデータが入力されていると仮定して、両方のエラーをユーザーに表示する方法はありますか? – User42