1

우리는 ManyToManyField 관계가있는 객체를 추가하는 클래스 기반 일반 뷰를 사용합니다. 우리는 을 사용하여 ManyToManyField에서 생성 된 관계에 대해 save()의 일부 값을 수정하려고 시도하지만, save()에서 이 생성 된 것처럼 보이지 않으므로 post_save 메소드를 호출해야합니다. get_success_url이므로 관계가 만들어집니다. 이것은 매우, 아주 못생긴 것 같습니다. save()를 떠나기 전에 관계를 강제로 만들려면 어떻게해야합니까?클래스 기반 일반 뷰의 ManyToManyField 및 저장 무시

this answer on SO은 form_valid()를 오버라이드하여 관계를 만드는 것을 보았습니다. 그러나 form_valid()와 get_success_url() 사이에 자동으로 생성 된 경우이 작업을 수행해야하는 이유는 무엇입니까? 이것은 Payment가 저장 될 때마다 수행해야하는 경우

# models.py 
class Payment(models.Model): 
    invoice = models.ManyToManyField(Invoice) 
    deposit_date = models.DateField() 
    check_number = models.CharField(max_length=100, blank=True, null=True) 
    description = models.TextField(blank=True, null=True) 

    def post_save(self): 
     """ 
     ManyToManyField relationships aren't formed yet when overriding save() for Class Based Generic 
     Views. Call this whenever you're saving a Payment object. 
     """ 
     for invoice in self.invoice.all(): 
      # Do some calcualtions that make us happy 
      invoice.save() 

# views.py - We override get_success_url() in UpdateView too. 
class PaymentAdd(CreateView): 
    model = Payment 
    form_class = PaymentForm 
    context_object_name = 'object' 
    template_name = 'form.html' 

    def get_success_url(self): 
     self.object.post_save() 
     return reverse('payment-page') 

답변

0

, 그것은 볼을 이동하는 대신 모델에 그 책임을두고하는 것이 좋습니다. 어딘가에 Payment 모델의 정의 아래 models.py에서

: 가장 좋은 방법은 이런 식으로 뭔가 같이 post_save 신호를 사용하는 것입니다

from django.db.models.signals import post_save 
from django.dispatch import receiver 

@receiver(post_save, sender=Payment) 
def my_handler(sender, instance, **kwargs): 
    for invoice in instance.invoice.all(): 
     # Do some calcualtions that make us happy 
     invoice.save() 

관련이없는 노트에, 나는 강하게 당신이 복수 사용하는 것이 좋습니다 M2M 필드의 속성 이름은이 경우 invoice 대신 invoices입니다. 그것은 동료 개발자들에게 훨씬 더 명확합니다.