【问题标题】:form not saving into user model Django表单未保存到用户模型 Django
【发布时间】:2020-10-16 12:26:12
【问题描述】:

我目前正在处理在线订阅服务的付款事项,为了获取用户信息以发送此内容,我有一张付款表格。

但是,由于某种原因,付款表单没有保存到用户帐户中。其他一切实际处理,我可以触发的唯一错误是“NOT NULL 约束失败:memberships_usermembership.user_id”

这是我的看法 -

@login_required()
def payments(request):
    user_membership = get_user_membership(request)
    selected_membership = get_selected_membership(request)
    form = SubscriptionForm()

    if request.method == "POST":
        form_data = {
                'full_name': request.POST['full_name'],
                'email': request.POST['email'],
                'phone_number': request.POST['phone_number'],
                'country': request.POST['country'],
                'postcode': request.POST['postcode'],
                'town_or_city': request.POST['town_or_city'],
                'street_address1': request.POST['street_address1'],
                'street_address2': request.POST['street_address2'],
                'county': request.POST['county'],
            }
        token = request.POST['stripeToken']
        form = SubscriptionForm(form_data)

        if form.is_valid():
            customer = stripe.Customer.retrieve(
                user_membership.stripe_customer_id)
            customer.source = token
            customer.save()

            subscription = stripe.Subscription.create(
                customer=user_membership.stripe_customer_id,
                items=[
                    {"plan": selected_membership.stripe_plan_id},
                ]
            )
            user_membership = get_user_membership(request)
            selected_membership = get_selected_membership(request)
            user_membership.membership = selected_membership
            user_membership.save()
            form.save(commit=True)

            subscription_id = subscription.id
            sub, created = Subscription.objects.get_or_create(
                user_membership=user_membership)
            sub.stripe_subscription_id = subscription_id
            sub.active = True
            sub.save()
            

            try:
                del request.session['selected_membership_type']
            except BaseException:
                pass

            return render(request, 'memberships/update-success.html')
        else:
            return redirect(reverse('membership_list'))

    context = {
        'selected_membership': selected_membership,
        'form': form,
    }

    return render(request, 'memberships/payment.html', context)

当 form.save() 是 return(render) 行上方的行时,它将正常处理所有内容,并且表单信息不会保存到 DB 中。 当 form.save() 行在上面的代码中时,它会闪烁 NOT NULL 错误。

任何想法如何让它工作?

谢谢!

编辑:这是 Django 中整个错误的链接 - http://dpaste.com/140VD8M

& a screenshot of it too!

这是我的模型 -

    class Membership(models.Model):
    membership_type = models.CharField(
        choices=MEMBERSHIP_CHOICES,
        default='Free',
        max_length=30)
    price = models.IntegerField(default=15)
    description = models.TextField(default="DESCRIPTION")
    image_url = models.URLField(max_length=1024, null=True, blank=True)
    image = models.ImageField(null=True, blank=True)
    stripe_plan_id = models.CharField(max_length=40)

    def __str__(self):
        return self.membership_type


class UserMembership(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    full_name = models.CharField(max_length=50, null=True, blank=True)
    email = models.EmailField(max_length=254, null=True, blank=True)
    phone_number = models.CharField(max_length=20, null=True, blank=True)
    country = CountryField(blank_label='Country',  default="Ireland")
    postcode = models.CharField(max_length=20, null=True, blank=True)
    town_or_city = models.CharField(max_length=40, null=True, blank=True)
    street_address1 = models.CharField(max_length=80, null=True, blank=True)
    street_address2 = models.CharField(max_length=80, null=True, blank=True)
    county = models.CharField(max_length=80, null=True, blank=True)
    stripe_customer_id = models.CharField(max_length=40)
    membership = models.ForeignKey(
        Membership, on_delete=models.SET_NULL, null=True)

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


def post_save_usermembership_create(
        sender, instance, created, *args, **kwargs):
    user_membership, created = UserMembership.objects.get_or_create(
        user=instance)

    if user_membership.stripe_customer_id is None or user_membership.stripe_customer_id == '':
        new_customer_id = stripe.Customer.create(email=instance.email)
        free_membership = Membership.objects.get(membership_type='Free')
        user_membership.stripe_customer_id = new_customer_id['id']
        user_membership.membership = free_membership
        user_membership.save()


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


class Subscription(models.Model):
    user_membership = models.ForeignKey(
        UserMembership, on_delete=models.CASCADE)
    stripe_subscription_id = models.CharField(max_length=40)
    active = models.BooleanField(default=False)

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

& 这里是我的用户成员身份定义 -

    @login_required()
def get_user_membership(request):
    user_membership_qs = UserMembership.objects.filter(user=request.user)
    if user_membership_qs.exists():
        return user_membership_qs.first()
    return None

【问题讨论】:

  • 请发布您收到的确切错误消息
  • @MichaelHawkins 刚刚添加了它!对不起!

标签: django django-forms


【解决方案1】:

您应该能够像这样将request.POST 传递给表单,而不是单独收集所有表单字段:

    form_data = request.POST
    token = request.POST['stripeToken']
    form = SubscriptionForm(form_data)

除此之外,没有看到确切的错误消息,没有什么可说的。如果你更新你的问题,我会更新我的答案。

编辑:

没有看到您的模型以及 get_user_membership() 返回的内容,您似乎在 UserMembership 类中缺少一个 User 对象(但如果没有看到更多内容我无法判断):

 user_membership.user = request.user

或者类似的东西。

【讨论】:

  • 嘿!对不起,我刚刚更新了,我也加了截图!
  • 错误来自模型。你能发布你的模型吗?某处缺少用户属性。你能发布 get_user_membership() 函数吗?
  • 嘿!非常感谢你的帮忙!我刚刚在那里添加了它们:)
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多