2017-07-12 3 views
0

Ich habe zwei verknüpfte Modelle:Wie kann ich eine Instanz eines Modells erstellen, sobald eine Instanz eines anderen Modells erstellt wird?

class MyUser(AbstractBaseUser, PermissionsMixin): 
    username = models.CharField(max_length=24, unique=True) 

class Profile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, 
    on_delete=models.CASCADE, null=True, blank=True) 

Nutzer meiner Website registrieren und schaffen, ein Konto zuerst (MyUser), sollte ihr noch nicht erstellt/Leerprofil (Profil) in der Lage zu sehen und dann habe die Möglichkeit, ihr leeres Profil in der profil_detail-Seite zu bearbeiten/speichern.
Mein ProfileDetailView:

class ProfileDetailView(DetailView): 
    template_name = 'profile/profile_detail.html' 
    def get_object(self, *args, **kwargs): 
     user_profile = self.kwargs.get('username') 
     obj = get_object_or_404(Profile, user__username=user_profile) 
     return obj 

Sie können nicht ihre eigene Profilseite nach der Anmeldung Zugriff aufgrund ihres Profils Instanz nicht erstellt worden ist. Damit sie ihr Profil gehen und das leere Profil einzusehen, dann ihre ProfileUpdateForm aktualisieren von dort, ich habe versucht Signalisierung:

def user_post_save_receiver(sender, instance, created, *args, **kwargs): 
    if not instance.profile.exists(): 
    Profile.objects.create(user=instance) 

sowie

def user_post_save_receiver(sender, instance, created, *args, **kwargs): 
    Profile.objects.get_or_create(user=instance) 

Die erste der beiden Renditen RelatedObjectDoesNotExist: MyUser has no profile.
Die zweite funktioniert, aber Django Docs empfehlen nicht, get_or_create dort zu verwenden.

Was ist ein besserer Weg, um das gewünschte Ergebnis zu erzielen?
Auch ist ein class ProfileCreateView(CreateView): auch in diesem Fall notwendig, wenn ich

class ProfileUpdateView(UpdateView): 
    form_class = ProfileUpdateForm 
    template_name = 'profile/profile_edit.html' 

    def get_object(self, *args, **kwargs): 
     user_profile = self.kwargs.get('username') 
     obj = get_object_or_404(Profile, user__username=user_profile) 
     return obj 

    def form_valid(self, form): 
     instance = form.save(commit=False) 
     instance.user = self.request.user 
     return super(ProfileUpdateView, self).form_valid(form) 

haben?

Antwort

1

Dieses Signal hat ein created Argument; Sie können das überprüfen, weil Sie wissen, dass ein neu erstellter Benutzer ein Profil benötigt.

def user_post_save_receiver(sender, instance, created, *args, **kwargs): 
    if created: 
    Profile.objects.create(user=instance) 
Verwandte Themen