0
class Session(models.Model):
tutor = models.ForeignKey(User)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
什麼是始終防止start_time
重疊end_time
的最佳方式?Django的 - 防止日期範圍重疊
class Session(models.Model):
tutor = models.ForeignKey(User)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
什麼是始終防止start_time
重疊end_time
的最佳方式?Django的 - 防止日期範圍重疊
首先,你應該在形式層面做到這一點,看到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)
但是,這是相當低的水平,所以它不是用戶友好的。
在表單級別,我必須爲每種形式的應用程序定義這種行爲嗎? – 2012-03-22 11:14:42
您應該定義此行爲一次且僅限一次。你可以在SessionForm中定義這個行爲,並且有其他的Session類從SessionForm繼承下來。 – jpic 2012-03-22 11:16:52
好的我明白了,我會嘗試繼承表單。謝謝 – 2012-03-22 11:19:19