Python 如何在创建不同模型的实例后立即创建一个模型的实例?
我有两个链接模型:Python 如何在创建不同模型的实例后立即创建一个模型的实例?,python,django,django-models,django-forms,django-views,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,
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)
my site的用户首先注册并创建帐户MyUser应该能够查看其尚未创建的/空白的配置文件,然后可以在“配置文件\详细信息”页面中编辑/保存其空白配置文件。
我的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
他们无法在注册后访问自己的配置文件页面,因为他们的配置文件实例尚未创建。为了允许他们进入他们的配置文件并查看空白配置文件,然后从那里更新他们的PrimeLoDeDeFrm表单,我尝试信令:
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没有配置文件。
第二种方法可行,但Django文档不建议在那里使用get_或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)
?该信号有一个已创建的参数;您可以进行检查,因为您知道新创建的用户需要配置文件
def user_post_save_receiver(sender, instance, created, *args, **kwargs):
if created:
Profile.objects.create(user=instance)