Django自定义AbstractUser模型下Stripe ID存至新用户问题求助
问题根源分析
你遇到的问题核心是在结账流程中错误创建了新的CustomUser实例,而非更新当前已登录用户的资料。在你的checkout视图里,代码customer = CustomUser()会生成一个全新的用户对象,完全和当前登录的request.user脱节,这就导致Stripe相关ID被存到了新用户条目中,而非预期的当前用户账户里。
修复方案
修改pages/views.py中的checkout函数逻辑,直接操作当前登录的request.user对象(它本身就是CustomUser的实例,因为你用了自定义用户模型),而不是新建用户:
import os from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from users.models import CustomUser import stripe stripe.api_key = os.environ.get('STRIPE_SECRET_KEY') @login_required # 添加登录验证,确保只有登录用户能访问结账页 def checkout(request): if request.method == 'POST': stripe_customer = stripe.Customer.create(email=request.user.email, source=request.POST['stripeToken']) plan = 'redacted' # MONTHLY plan ID from Stripe subscriptions if request.POST['plan'] == 'yearly': plan = 'redacted' # YEARLY plan ID from Stripe subscriptions # 关键:直接使用当前登录用户,而非新建 subscription = stripe.Subscription.create(customer=stripe_customer.id, items=[{'plan':plan}]) current_user = request.user current_user.stripeid = stripe_customer.id # 注意:如果你的CustomUser模型里还没定义membership和cancel_at_period_end字段,需要先去models.py添加 current_user.membership = True current_user.cancel_at_period_end = False current_user.stripe_subscription_id = subscription.id current_user.save() return redirect('home') # 处理GET请求,返回结账页面 return render(request, 'checkout.html')
额外优化建议
模型字段补全与默认值设置
你的CustomUser模型里缺少membership和cancel_at_period_end字段,而且stripeid、stripe_subscription_id没有允许空值,会导致新用户注册时报错。建议修改users/models.py:from django.db import models from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): stripeid = models.CharField(max_length=255, blank=True, null=True) stripe_subscription_id = models.CharField(max_length=255, blank=True, null=True) membership = models.BooleanField(default=False) cancel_at_period_end = models.BooleanField(default=False)修正套餐选择逻辑
你原有的if-else结构存在漏洞:当用户选择年付套餐时,不会执行订阅创建和用户更新的逻辑。上面的修复代码已经把这部分逻辑移到了if-else外面,确保无论选哪种套餐都会执行后续操作。
内容的提问来源于stack exchange,提问作者Erin B.
相关产品推荐
相关产品推荐

