2016-12-31 5 views
1

以下の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_timestart_date_timeが過去にあるため、エラーが発生しました。 start_date_timeclean_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)} 

答えて

2

をあなたはclean_start_date_time代わりの戻りにエラーが発生したので、それはありません。あなたがしなければならないことをあなたがしたことに注意してください。フィールドがcleanに存在するとは決して決してすべきではありません。ユーザーがそのフィールドのデータを入力しなかった場合も同じことが起こりました。他に何かをする前に値が存在することを確認してください。

+0

POSTデータにstart_date_timeが存在します。 clean_start_date_timeにも存在します。しかし、清潔な方法でのみ存在しません。 – User42

+0

はい、私が与えた理由のために。これは*予想される動作*です。 –

+0

ポイントを得ました。 clean_start_date_timeがエラーを発生させている場合、それ以降はclean_start_date_timeがクリーンデータに存在しません。この特定のシナリオでは、ユーザーが最初のエラーを修正するまで、2番目のエラーは表示されません。ボットエラーがスローされるような方法でデータが入力されていると仮定して、両方のエラーをユーザーに表示する方法はありますか? – User42

1

documentationによれば、関数clean_start_date_timeは、クリーニングされたフィールド値start_date_timeを返します。

あなたの関数は、例外を指定して終了するか、またはcreed_dataで終了します。 - フィールド名を用いて置換され

clean_fieldname()メソッドは、フォームサブクラス で呼び出される:すなわち、cleaned_dataクリーン方法で同じとclean_start_date_time方法ではないことが理由でありますフォームフィールド属性の名前。

...

この方法は かかわらず、それが何かを変更するかどうかの、cleaned_dataから得た洗浄値を返す必要があります。

関連する問題