如何在带有AbstractBaseUser扩展的自定义用户模型中使用post_save信号

问题描述 投票:0回答:1

我的电子商务网站中有两个应用程序,我一直在关注YouTube上的特定教程。在课程中,该人员使用django-allauth软件包进行登录。我按照课程进行操作,但是在account应用中创建了自定义用户模型,扩展了AbstracBaseUser类。

我创建了另一个名为product

的应用程序,在其中处理了所有电子商务逻辑。

这里是代码:

models.py

(帐户)
class MyAccountManager(BaseUserManager):
    def create_user(self, email, username, first_name, last_name, gstin_no, phone_no, password=None):
        if not email:
            raise ValueError("Users must have an email address")
        if not username:
            raise ValueError("Users must have a username")
        if not first_name:
            raise ValueError("Users must have First Name")
        if not last_name:
            raise ValueError("Users must have Last Name")
        if not gstin_no:
            raise ValueError("Users must have a valid GSTIN Number")
        if not phone_no:
            raise ValueError("Users must have a valid Phone Number")

        user = self.model(
                email=self.normalize_email(email),
                username=username,
                first_name=first_name,
                last_name=last_name,
                gstin_no=gstin_no,
                phone_no=phone_no,
            )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, first_name, last_name, gstin_no, phone_no, password):
        user = self.create_user(
                email=self.normalize_email(email),
                password=password,
                username=username,
                first_name=first_name,
                last_name=last_name,
                gstin_no=gstin_no,
                phone_no=phone_no,
            )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

class Account(AbstractBaseUser):
    email               = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username            = models.CharField(max_length=30, unique=True)
    date_joined         = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login          = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin            = models.BooleanField(default=False)
    is_active           = models.BooleanField(default=True)
    is_staff            = models.BooleanField(default=False)
    is_superuser        = models.BooleanField(default=False)
    first_name          = models.CharField(verbose_name="first name", max_length=20)
    last_name           = models.CharField(verbose_name="last name", max_length=20)
    gstin_no            = models.CharField(verbose_name='gstin no', max_length=15, unique=True)
    phone_no            = models.BigIntegerField(unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'gstin_no', 'phone_no', ]

    objects = MyAccountManager()

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

models.py

(产品)
class UserProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    stripe_customer_id = models.CharField(max_length=50, blank=True, null=True)
    one_click_purchasing = models.BooleanField()

    def __str__(self):
        return self.user.username

def userprofile_receiver(sender, instance, created, *args, **kwargs):
    if created:
        userprofile = UserProfile.objects.create(user=instance)

post_save.connect(userprofile_receiver, sender=settings.AUTH_USER_MODEL)

views.py

(产品)
class PaymentView(LoginRequiredMixin, View):
    def get(self, *args, **kwargs):
        order = Order.objects.get(user=self.request.user, ordered=False)
        if order.billing_address:
            context = {
                'order': order,
                'DISPLAY_COUPON_FORM': False
            }
            userprofile = self.request.user.userprofile
            if userprofile.one_click_purchasing:
                #fetch the user's card list
                cards = stripe.Customer.list_sources(
                    userprofile.stripe_customer_id,
                    limit = 3,
                    object = 'card'
                )
                card_list = cards['data']
                if len(card_list) > 0:
                    # update the card with the default card
                    context.update({
                        'card': card_list[0]
                    })
            return render(self.request, 'product/payment.html', context)
        else:
            messages.warning(self.request, "You have not added a billing address.")
            return redirect("checkout")

我得到的错误是:RelatedObjectDoesNotExist at /payment/stripe/帐户没有用户个人资料。

我如何使它正常工作。我无法从这里得到关于什么地方出问题的概念。

我的电子商务网站中有两个应用程序,我一直在关注YouTube上的特定教程。在课程中,该人员使用django-allauth软件包进行登录。我遵循了课程...

django django-models django-signals django-custom-user
1个回答
0
投票

转到django管理员,检查是否创建了用户配置文件。如果不。然后可能您已经在添加此信号功能之前添加了用户。

© www.soinside.com 2019 - 2024. All rights reserved.