我有两个相关的模型:
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)
答案 0 :(得分:1)
该信号有created
个参数;您可以检查一下,因为您知道新创建的用户需要个人资料。
def user_post_save_receiver(sender, instance, created, *args, **kwargs):
if created:
Profile.objects.create(user=instance)