想象一下这个模型
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 访问用户。
