我有一个重写的用户模型和购物车模型.我希望在创建User模型实例后自动创建Cart模型实例.我试图将新注册的用户传递给get_queryset方法,但不知道如何做到这一点.还有其他更好的方法吗?这是因为我可能需要为其他模型做同样的事情,而不像User模型有一个可以将值传递给get_queryset方法的形式.
帐户/ models.py:
class Cart(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
def __str__(self):
return self.user.email + '_cart'
Run Code Online (Sandbox Code Playgroud)
帐户/ views.py:
class RegisterView(generic.CreateView):
template_name = 'account/register.html'
form_class = RegisterForm
success_url = reverse_lazy('book:home')
def get_queryset(self):
sign_up = self.request.POST.get('register')
if sign_up:
c = Cart.objects.create(user=???)
c.save()
Run Code Online (Sandbox Code Playgroud)
帐户/模板/帐号/ register.html:
<form name="register" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Sign Up">
</form>
Run Code Online (Sandbox Code Playgroud)
方法-1:使用Django的post_save信号(如@AKX所说)
from django.contrib.auth import get_user_model
@receiver(post_save, sender=get_user_model())
def create_user_cart(sender, instance, created, **kwargs):
if created:
Cart.objects.create(user=instance)Run Code Online (Sandbox Code Playgroud)
方法2:覆盖用户模型或扩展用户模型的 save()方法
class MyUserModel(....):
# your code
def save(self,*args,**kwargs):
created = not self.pk
super().save(*args,**kwargs)
if created:
Cart.objects.create(user=self)Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1001 次 |
| 最近记录: |