You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')
额外优化建议
  1. 模型字段补全与默认值设置
    你的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)
    
  2. 修正套餐选择逻辑
    你原有的if-else结构存在漏洞:当用户选择年付套餐时,不会执行订阅创建和用户更新的逻辑。上面的修复代码已经把这部分逻辑移到了if-else外面,确保无论选哪种套餐都会执行后续操作。

内容的提问来源于stack exchange,提问作者Erin B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:41:45