2017-11-22 7 views
0

나는 두 가지 모델 ProfileCompanyDjango 신호 여러 보낸 사람과 여러 인스턴스에서 post_save 메서드를 수행하는 방법은 무엇입니까? 당신이 <code>Profile</code>이 user_model 확장 기능입니다 볼 수 있듯이

models.py

class Profile(models.Model): 
    user = models.OneToOneField(User) 
    company = models.ForeignKey('company.Company', null=True) 
    phone = models.CharField(max_length=10, blank=True) 

@receiver(post_save, sender=User) 
@receiver(post_save, sender=Company) 
def update_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 
     Profile.objects.create(company=instance) 
    instance.profile.save() 

있습니다. 인스턴스를 하나만 보낼 때 작동하도록했습니다.

models.py

class Company(models.Model): 
    user = models.OneToOneField(User) 
    name = models.CharField(max_length=10, blank=True, unique=True) 
    phone = models.CharField(max_length=10, blank=True) 

Company이 성공적으로 생성됩니다. 회사를 만들 때 필드를 CompanyProfile으로 저장하고 싶습니다. 신호 기반의 접근 방식에 대한 코드해야 다음 모델 아키텍처에 따르면 views.py

def form_valid(self, form): 
    company = form.save(commit=False) 
    user = self.request.user 
    name=form.cleaned_data['name'] 
    phone=form.cleaned_data['phone'] 
    company.name = name 
    company.phone = phone 
    company.user = user 
    company.save() 
    Profile.refresh_from_db() 
    Profile.company = name 
    Profile.save() 
    return super(CompanyCreateView, self).form_valid(form) 
+0

[하나 개의 수신기와 다수의 포스트 \ _save의 신호들을 통합]의 가능한 복제 (https://stackoverflow.com/questions/17507784/consolidating-multiple-post-save-signals-with-one-receiver) –

+0

나는 전에 그것을 보았다. 신호를 여러 사람에게 보내는 방법을 알 수 있습니다. 단일 신호로 여러 인스턴스를 전달하는 방법을 알고 싶습니다. 'views.py'는 더 나은 이해를 줄 것입니다. –

+0

장고 (Django) 내장 신호는이 사건을 처리 할 수 ​​없습니다. 대신 자신의 신호를 만들어야합니다. https://docs.djangoproject.com/en/1.11/topics/signals/#defining-and-sending-signals –

답변

1

.

@receiver(post_save, sender=User) 
@receiver(post_save, sender=Company) 
def update_user_profile(sender, instance, created, **kwargs): 
    if created: 
     if sender.__name__ == 'User': 
      Profile.objects.create(user=instance) 
     # Company 
     else: 
      profile = Profile.objects.get(user=instance.user) 
      profile.company = instance 
      profile.save()