表单未保存到用户模型Django中

时间:2020-06-25 23:11:52

标签: django django-forms

我目前正在处理在线订阅服务的付款事宜,为了获得用户发送该物品的信息,我有一张付款表格。

但是,由于某种原因,付款表格未保存到用户帐户中。其他所有内容实际上都在处理,我唯一可以触发的错误是“ 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)行上方的行时,它将正常处理所有内容,而表单信息将不会保存到数据库中。 当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

1 个答案:

答案 0 :(得分:0)

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

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

除此之外,没有看到确切的错误消息,没有更多要说的。如果您更新了问题,我会更新我的答案。

编辑:

没有看到您的模型和返回的get_user_membership(),似乎您在UserMembership类中缺少一个User对象(但我看不到看不到):

 user_membership.user = request.user

或者类似的东西。

相关问题