django模型中的Clean方法未触发

django模型中的Clean方法未触发,django,Django,在我的模型中,我的clean方法限制只有一个活动记录 因此,在clean方法中,我只为每个租约限制一个组合,即活动=真和终止=假 class LeaseTerm(CommonInfo): version = IntegerVersionField( ) start_period = models.ForeignKey(Period, related_name='start_period' ) end_period = models.Foreign

在我的模型中,我的clean方法限制只有一个活动记录

因此,在clean方法中,我只为每个租约限制一个组合,即
活动=真
终止=假

 class LeaseTerm(CommonInfo):
        version = IntegerVersionField( )
        start_period = models.ForeignKey(Period, related_name='start_period' )
        end_period = models.ForeignKey(Period, related_name='end_period')
        lease = models.ForeignKey(Lease)
        increase  = models.DecimalField(max_digits=7, decimal_places=2)
        amount  = models.DecimalField(max_digits=7, decimal_places=2)
        is_terminated = models.BooleanField(default=False)


        def clean(self):
                model = self.__class__
                if self.lease_id and (self.is_terminated == False) and model.objects.filter(lease=self.lease, is_active=True ).exclude(id=self.id).count() > 0:
                    raise ValidationError('!Lease has a active Term , terminate existing term  prior to creation of a new one'.format(self.lease))
这就是创造一个新术语的观点

def term_new(request,pk,uri):
    lease = get_object_or_404(Lease, pk=pk)
    title = 'term'
    uri = _get_redirect_url(request, uri)
    if request.method == "POST":
        form = LeaseTermForm(request.POST)
        form.lease = lease
        if form.is_valid():
            term = form.save(commit=False)  
            #term.lease = lease      
            term.save()
            messages.add_message(request, messages.SUCCESS, str(term.id) + "-SUCCESS Object created sucssefully")


            return redirect(uri)
    else:
        form = LeaseTermForm()
    return render(request, 'object_edit.html', {'form': form, 'title': title, 'extend': EXTEND})
形式

但是,clean方法不再被触发,它不会阻止用户在同一租约下创建新记录,并且
is\u active=True
is\u terminated=False

 class LeaseTerm(CommonInfo):
        version = IntegerVersionField( )
        start_period = models.ForeignKey(Period, related_name='start_period' )
        end_period = models.ForeignKey(Period, related_name='end_period')
        lease = models.ForeignKey(Lease)
        increase  = models.DecimalField(max_digits=7, decimal_places=2)
        amount  = models.DecimalField(max_digits=7, decimal_places=2)
        is_terminated = models.BooleanField(default=False)


        def clean(self):
                model = self.__class__
                if self.lease_id and (self.is_terminated == False) and model.objects.filter(lease=self.lease, is_active=True ).exclude(id=self.id).count() > 0:
                    raise ValidationError('!Lease has a active Term , terminate existing term  prior to creation of a new one'.format(self.lease))

原因可能是什么?

我认为
form.is\u valid()
方法不调用models
clean
方法,而是清理表单字段,然后尝试保存它。在保存过程中会引发错误,因为您自己没有处理它,所以会引发错误。一种(相当糟糕的)修复方法是:

def term_new(request,pk,uri):
    lease = get_object_or_404(Lease, pk=pk)
    title = 'term'
    uri = _get_redirect_url(request, uri)
    if request.method == "POST":
        form = LeaseTermForm(request.POST)
        form.lease = lease
        if form.is_valid():
            term = form.save(commit=False)  
            #term.lease = lease  
            try:    
                term.save()
            except ValidationError:
                pass # Handle returning errors

更好的方法是将清理移到表单的清理方法之一。

我认为
表单.is\u valid()
方法不调用models
clean
方法,而是清理表单字段,然后尝试保存它。在保存过程中会引发错误,因为您自己没有处理它,所以会引发错误。一种(相当糟糕的)修复方法是:

def term_new(request,pk,uri):
    lease = get_object_or_404(Lease, pk=pk)
    title = 'term'
    uri = _get_redirect_url(request, uri)
    if request.method == "POST":
        form = LeaseTermForm(request.POST)
        form.lease = lease
        if form.is_valid():
            term = form.save(commit=False)  
            #term.lease = lease  
            try:    
                term.save()
            except ValidationError:
                pass # Handle returning errors

更好的方法是将清理移到表单的一种清理方法。

我想您需要在重写save方法时调用它。呼叫那里的
full\u clean
。是的,好主意,谢谢,它确实触发了它。但是现在我从引发错误中得到了500个错误页面,我想当您重写save方法时,您需要调用它。呼叫那里的
full\u clean
。是的,好主意,谢谢,它确实触发了它。但是现在,我从提出错误中得到了500个错误页面