2017-07-12 24 views
0

私は2つのリンクされたモデルがあります:私のサイトレジスタの異なるモデルのインスタンスが作成されるとすぐに1つのモデルのインスタンスを作成するにはどうすればよいですか?

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) 

ユーザーを最初(MyUserとする)アカウントを作成し、その未作成/ブランクのプロファイル(プロファイル)を表示した後、持っていることができるはずです空白のプロファイルをprofile_detailページから編集/保存するオプション。
マイ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 

彼らが作成されなかったため、自分のプロファイルインスタンスに登録した後、自分のプロフィールページにアクセスすることはできません。

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

など

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

2つのリターンの最初の:彼らは自分のプロフィールに移動し、空白のプロフィールを閲覧できるようにするために、そこから自分のProfileUpdateFormを更新し、私は、シグナリングをしようとしてきましたRelatedObjectDoesNotExist: MyUser has no profile.
Djangoのドキュメントでは、get_or_createの使用を推奨していません。

希望する結果を得るにはどのような方法が良いですか?私は

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) 

を持っている場合
はまた、この場合でも、必要class ProfileCreateView(CreateView):のですか?

答えて

1

その信号にはcreatedという引数があります。新しく作成されたユーザーがプロファイルを必要としていることを知っているので、これを確認できます。

def user_post_save_receiver(sender, instance, created, *args, **kwargs): 
    if created: 
    Profile.objects.create(user=instance) 
関連する問題