Skip to main content
 首页 » 编程设计

python之Django之重叠日期范围的表单验证

2024年08月28日26myhome

想象一下这个模型

class Session(models.Model): 
    user = models.ForeignKey(User) 
    start_time = models.DateTimeField() 
    end_time = models.DateTimeField() 

要添加/更新 session ,我使用此 modelForm

class SessionForm(forms.ModelForm): 
    class Meta: 
        model = Session 
        fields = ('start_time', 'end_time',) 

因为我需要防止同一 user 的 session 重叠,所以我清理了这个表单

def clean(self): 
    cleaned_data = super(SessionForm, self).clean() 
    start = cleaned_data.get('start_time') 
    end = cleaned_data.get('end_time') 
    conflicts = Session.objects.filter( 
            start_time__lte=end, 
            end_time__gte=start, 
        ) 
    if any(conflicts): 
        raise forms.ValidationError(_("%i conflicts found" % conflicts.count())) 
    return cleaned_data 

但是因为我在 save() 之后添加了 user

if form.is_valid(): 
    session = form.save(False) 
    session.user = request.user 
    session.save() 

如何将其包含在冲突检查中?

换句话说,我如何将 user 作为参数传递给 clean() ?

请您参考如下方法:

有一种方法可以替代 __init__ 方法。创建表单时,传递一个带有 user 集的 session 实例。

session = Session(user=request.user) 
form = SessionForm(data=request.POST, instance=session) 
if form.is_valid(): 
    form.save() 

然后在您的 clean 方法中,您可以作为 self.instance.user 访问用户。