【发布时间】:2015-07-22 03:42:54
【问题描述】:
我有一个经过良好验证的模型,我在 模型 中使用clean 方法。问题是当我验证时,我正在使用一个尚未以表单设置的对象,这会引发该对象尚不存在的异常。
我想要一个解决方案,在任何验证之前将对象从 url 主键传递到表单,所以我的 clean 方法可以正常工作。
这是一个类似的例子。
主要型号
class Student(models.Model):
first_name = models.CharField(max_length=30)
让我们坐下来,每个学生一次可能有一个学期。但是,如果之前有任何学期,则开始日期必须在最后一个学期结束日期之后。
class Semester(models.Model):
student = models.OneToOneField(Student)
start_date = models.DateField()
def clean(self):
# do not allow the start date to be before last semester end date
if self.student.semesterhistory_set.all().count() > 0:
last_semester_end_date = self.student.semesterhistory_set.last().end_date
if last_semester_end_date >= self.start_date:
message = _("Start Date for this semester must be after %s" % last_date)
raise ValidationError(message)
class SemesterHistory(models.Model):
student = models.ForeignKey(Student)
start_date = models.DateField()
end_date = models.DateField()
在视图中,我正在传递将在验证表单后用于验证的学生对象。 (问题)
# URL for this is like this student/(pk)/semesters/create/
class SemesterCreate(CreateView):
model = Semester
fields = ['start_date']
def form_valid(self, form):
form.instance.student = get_object_or_404(Student, id=int(self.kwargs['pk']))
return super(SemesterCreate, self).form_valid(form)
错误:
RelatedObjectDoesNotExist Semester has no student
【问题讨论】:
标签: python django django-models