如何在创建不同模型的实例后立即创建一个模型的实例?

时间:2017-07-12 12:07:03

标签: python django django-models django-forms django-views

我有两个相关的模型:

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  

由于他们的个人资料实例尚未创建,他们无法在注册后访问自己的个人资料页面。为了允许他们转到他们的个人资料并查看空白个人资料,然后从那里更新他们的ProfileUpdateForm,我试图发信号:

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)  

两个中的第一个返回RelatedObjectDoesNotExist: MyUser has no profile.
第二个工作,但Django文档不建议在那里使用get_or_create。

获得理想结果的更好方法是什么? 此外,当我有

时,在这种情况下甚至需要class ProfileCreateView(CreateView):
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)

1 个答案:

答案 0 :(得分:1)

该信号有created个参数;您可以检查一下,因为您知道新创建的用户需要个人资料。

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