2016-10-02 3 views
0

내 청소 방법의 한계 그래서 청소 방법에 나는 = 활성 True입니다 각 임대에 대해 하나 개의 조합을 제한청소 방법은 내 모델에서

를 하나의 활성 기록을 가지고 트리거 = 거짓

is_terminated하지
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}) 

형태

class LeaseTermForm(forms.ModelForm): 
    class Meta: 
     model = LeaseTerm 
     fields = [ 'amount', 
     'start_period','end_period', 'increase','is_terminated' ] 

그러나 clean 메소드가 더 이상 트리거되지 않으면 사용자가 is_active = true 및 is_terminated = false를 사용하여 동일한리스에서 새 레코딩을 만들지 못하게됩니다. 이유가 무엇일까요?

+1

저장 방법을 재정의 할 때 호출해야한다고 생각합니다. http://stackoverflow.com/questions/18803112/django-doesnt-call-model-clean-method 여기에서'full_clean'을 호출하십시오. – Lucas03

+0

예, 좋은 생각 감사합니다. 하지만 지금은 500 오류 페이지에서 점점 오류가 발생했습니다. –

답변

2

form.is_valid() 메서드는 모델 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 

이 형태의 청소 방법 중 하나에 청소를 이동하는 것입니다 할 수있는 더 좋은 방법입니다.