2012-03-22 7 views
0
class Session(models.Model): 
    tutor = models.ForeignKey(User) 
    start_time = models.DateTimeField() 
    end_time = models.DateTimeField() 

常にend_timeをオーバーラップからstart_timeを防止するための最良の方法は何ですか重複防止の日付範囲?ジャンゴ -

答えて

1

まず、あなたがこれを行う方法についてはCleaning and validating fields that depend on each otherを参照して、フォームレベルでこれを行う必要があり、それは次のようになります。また

def clean(self): 
    cleaned_data = super(YourForm, self).clean() 
    if cleaned_data['start_time'] > cleaned_data['end_time']: 
     raise forms.ValidationError(_(u'Start time must be before end time')) 

、保存中に低レベルでそれを強制することができますメソッドまたはpre_savesignal中:

from django.db.models import signals 

class StartTimeAfterEndTimeException(Exception): 
    def __init__(self, model): 
     super(StartTimeAfterEndTimeException, self).__init__(
      'Start time %s should not be after end time %s' % (
       model.start_time, model.end_time)) 

def session_force_end_time(sender, instance, **kwargs): 
    if instance.start_time >= instance.end_time: 
     raise StartTimeAfterEndTimeException(instance) 
signals.pre_save.connect(session_force_end_time, sender=Session) 

しかし、それはユーザーフレンドリーではありませんので、それはかなり低レベルです。

+0

フォームレベルでは、アプリケーションの各フォームに対してこの動作を定義する必要がありますか? –

+0

この動作は、一度だけ定義する必要があります。 SessionFormでこの振る舞いを定義し、SessionFormから継承するSessionのための他のフォームクラスを持つことができます。 – jpic

+0

さて、私はフォームを継承しようとしています。ありがとうございました –