我有一個很好的驗證模型,我在模型內使用clean
方法。問題是當我驗證我正在使用的對象沒有被設置在引發異常的對象不存在的形式中。將對象傳遞給modelForm之前CreateView form_valid方法
我想要一個解決方案,將對象從url主鍵傳遞給表單之前的任何驗證,所以我乾淨的方法工作正常。
下面是一個類似的例子。
主要模式
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
但是,表單實例在驗證之前沒有學生對象。如果你在form_valid中,那麼你傳遞了'model.clean()',這是在沒有學生對象集的情況下不可能發生的。儘管如此,感謝您提供404 hint – Othman
hm,我已經徹底地讀過您的問題了......對於快速猜測:D在您的情況下,我建議使用事務處理...將代碼從'clean'移動到'save'方法,然後如果某些條件使用'rollback'(也可以引發ValidationError:D)https://docs.djangoproject.com/en/1.8/topics/db/transactions/#django.db.transaction.savepoint_rollback ... PS我會明天編輯答案,或者您可能會更快地編輯答案:D – madzohan