首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >FieldError /cart/结账/结帐

FieldError /cart/结账/结帐
EN

Stack Overflow用户
提问于 2018-04-22 22:26:10
回答 2查看 145关注 0票数 1

例外值:

无法将关键字'active‘解析为字段。

选择是:billing_profilebilling_profile_idbrandcountrydefaultexp_monthexp_yearidlast4stripe_id

当我点击结帐按钮时,它显示出错误。我已经有很多相互关联的模型,我检查了所有的模型,但是没有任何错误,所以请您验证一下。

计费models.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.conf import settings
from django.db import models
from django.db.models.signals import post_save,pre_save
from accounts.models import GuestEmail
import stripe

User=settings.AUTH_USER_MODEL


STRIP_SECRET_KEY= getattr(settings,"STRIP_SECRET_KEY","sk_test_I2eGCibhrZeFd9N0ipx9ac4I")
#STRIP_PUB_KEY=getattr(settings,"STRIP_PUB_KEY","pk_test_nvw3qh6iGMtKSGHMW5MHVwQD")
stripe.api_key=STRIP_SECRET_KEY

class BillingProfileManager(models.Manager):
    def new_or_get(self,request):
        user=request.user
        guest_email_id=request.session.get('guest_email_id')
        created=False
        obj=None
        if user.is_authenticated:
            obj,created= self.model.objects.get_or_create(
                                    user=user, email=user.email)

        elif guest_email_id is not None:
            guest_email_obj = GuestEmail.objects.get(id=guest_email_id)
            obj, created = self.model.objects.get_or_create(
                                    email=guest_email_obj.email)
        else:
            pass
        return obj,created

class BillingProfile(models.Model):
    user=models.OneToOneField(User,null=True,blank=True,on_delete=models.CASCADE)
    email=models.EmailField()
    active=models.BooleanField(default=True)
    update = models.DateTimeField(auto_now=True)
    timestamp=models.DateTimeField(auto_now_add=True)
    customer_id=models.CharField(max_length=120,null=True,blank=True)

    objects=BillingProfileManager()

    def __str__(self):
        return self.email

    def charge(self,order_obj,card=None):
        return Charge.objects.do(self,order_obj,card)

    def get_cards(self):
        return self.card_set.all()

    @property
    def has_card(self):
        card_qs=self.get_cards()
        return  card_qs.exists()

    @property
    def default_card(self):
        default_cards=self.get_cards().filter(default=True)
        if default_cards.exists():
            return self.default_cards.first()
        return None

def billing_profile_created_receiver(sender,instance,*args,**kwargs):
    if not instance.customer_id and instance.email:
        print("ACTUAL AIL REQUEST SEND")
        customer=stripe.Customer.create(
            email=instance.email
        )
        print (customer)
        instance.customer_id=customer.id

pre_save.connect(billing_profile_created_receiver,sender=BillingProfile)

class CardManager(models.Manager):
    def all(self, *args, **kwargs): # ModelKlass.objects.all() --> ModelKlass.objects.filter(active=True)
       return self.get_queryset().filter(active=True)

    def add_new(self, billing_profile, token):
        if token:
            customer = stripe.Customer.retrieve(billing_profile.customer_id)
            stripe_card_response = customer.sources.create(source=token)
            new_card = self.model(
                    billing_profile=billing_profile,
                    stripe_id = stripe_card_response.id,
                    brand = stripe_card_response.brand,
                    country = stripe_card_response.country,
                    exp_month = stripe_card_response.exp_month,
                    exp_year = stripe_card_response.exp_year,
                    last4 = stripe_card_response.last4
                )
            new_card.save()
            return new_card
        return None

def user_created_receiver(sender,instance,created,*args,**kwargs):
    if created and instance.email:
        BillingProfile.objects.get_or_create(user=instance,email=instance.email)
post_save.connect(user_created_receiver,sender=User)

class ChargeManager(models.Manager):
    def do(self, billing_profile, order_obj, card=None): # Charge.objects.do()
        card_obj = card
        if card_obj is None:
            cards = billing_profile.card_set.filter(default=True) # card_obj.billing_profile
            if cards.exists():
                card_obj = cards.first()
        if card_obj is None:
            return False, "No cards available"
        c = stripe.Charge.create(
              amount = int(order_obj.total * 100), # 39.19 --> 3919
              currency = "usd",
              customer =  billing_profile.customer_id,
              source = card_obj.stripe_id,
              metadata={"order_id":order_obj.order_id},
            )
        new_charge_obj = self.model(
                billing_profile = billing_profile,
                stripe_id = c.id,
                paid = c.paid,
                refunded = c.refunded,
                outcome = c.outcome,
                outcome_type = c.outcome['type'],
                seller_message = c.outcome.get('seller_message'),
                risk_level = c.outcome.get('risk_level'),
        )
        new_charge_obj.save()
        return new_charge_obj.paid, new_charge_obj.seller_message


class Charge(models.Model):
    billing_profile         = models.ForeignKey(BillingProfile,on_delete=models.CASCADE)
    stripe_id               = models.CharField(max_length=120)
    paid                    = models.BooleanField(default=False)
    refunded                = models.BooleanField(default=False)
    outcome                 = models.TextField(null=True, blank=True)
    outcome_type            = models.CharField(max_length=120, null=True, blank=True)
    seller_message          = models.CharField(max_length=120, null=True, blank=True)
    risk_level              = models.CharField(max_length=120, null=True, blank=True)

    objects = ChargeManager()

class Card(models.Model):
    billing_profile=models.ForeignKey(BillingProfile,on_delete=models.CASCADE)
    stripe_id=models.CharField(max_length=120)
    brand=models.CharField(max_length=120,null=True,blank=True)
    country = models.CharField(max_length=12, null=True, blank=True)
    exp_month=models.IntegerField(null=True,blank=True)
    exp_year=models.IntegerField(null=True,blank=True)
    last4=models.CharField(max_length=4,null=True,blank=True)
    default=models.BooleanField(default=True)

    objects = CardManager()

    def __str__(self):
        return "{} {}".format(self.brand, self.last4)

checkout.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% extends "base.html" %}
{% block content %}

{% if not billing_profile%}
<div class="row text-center">
<div class="col-12 col-md-6">
    <p class="lead">Login</p>
    {% include 'accounts/snippets/form.html' with form=login_form next_url=request.build_absolute_uri %}
</div>
<div class="col-12 col-md-6">
    Continue as Guest
    {% url "guest_register" as guest_register_url %}
    {% include 'accounts/snippets/form.html' with form=guest_form next_url=request.build_absolute_uri action_url=guest_register_url %}
    </div>
</div>

{% else %}

    {% if not object.shipping_address %}

        <div class="row">
            <div class="col-12">
                <p class="lead">Shipping Address</p>
                <hr/>
            </div>
            <div class="col-6">

                {% url "checkout_address_create" as checkout_address_create %}
                {% include 'addresses/form.html' with form=address_form next_url=request.build_absolute_uri action_url=checkout_address_create address_type='shipping' %}'


            </div>
            <div class="col-6">
                {% url 'checkout_address_reuse' as checkout_address_reuse %}
             {% include 'addresses/prev_addresses.html' with address_qs=address_qs next_url=request.build_absolute_uri address_type='shipping' action_url=checkout_address_reuse %}
            </div>
            </div>
    {% elif not object.billing_address %}

    <div class="row">
        <div class="col-12">
            <p class="lead">Billing Address</p>
            <hr/>
            </div>
    <div class="col-md-6">
        {% url "checkout_address_create" as checkout_address_create %}
        {% include 'addresses/form.html' with form=address_form next_url=request.build_absolute_uri action_url=checkout_address_create address_type='billing' %}
        </div>
            <div class="col-6">
           {% url 'checkout_address_reuse' as checkout_address_reuse %}
            {% include 'addresses/prev_addresses.html' with address_qs=address_qs next_url=request.build_absolute_uri address_type='billing' action_url=checkout_address_reuse %}
            </div>
            </div>

    {% else%}
            {% if not has_card %}
                <!-- enter credit card here -->
                <div class='stripe-payment-form' data-token='{{ publish_key }}' data-next-url='{{ request.build_absolute_uri }}' data-btn-title='Add Payment Method'></div>

            {% else %}
                <h1>Finalize Checkout</h1>
                <p>Cart Item:{% for product in object.cart.products.all %}{{ product}}{% if not forloop.last %},{% endif %},{% endfor %}</p>
                <p>Shipping Address:{{object.shipping_address.get_address}}</p>
                <p>Billing Address:{{object.shipping_address.get_address}}</p>
                <p>Cart Total:{{object.cart.total}}</p>
                <p>Shipping Total:{{object.shipping_total}}</p>
                <p>Order Total:{{object.total}}</p>
                <form class="form" method="POST" action="">{% csrf_token %}
                 <button type="submit btn btn-success">Checkout</button>
                </form>
            {% endif %}
    {% endif %}

{% endif %}

{% endblock %}
EN

回答 2

Stack Overflow用户

发布于 2018-04-23 22:18:22

问题似乎在您的CardManager声明中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CardManager(models.Manager):
    def all(self, *args, **kwargs):
       return self.get_queryset().filter(active=True)

active不是Card模型上的字段,而是来自Card模型的BillingProfile FK上的字段。

将此更改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CardManager(models.Manager):
    def all(self, *args, **kwargs):
       return self.get_queryset().filter(billing_profile__active=True)
票数 1
EN

Stack Overflow用户

发布于 2021-02-05 10:39:41

这很可能发生,因为您试图通过其模型没有的属性筛选查询集。

缺少此属性的模型是通过跟踪向您显示属性的模型:

billing_profile, billing_profile_id, brand, country, default, exp_month, exp_year, id, last4, stripe_id.

也就是说,Card模型。

添加如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
active = models.BooleanField(default=True)

对于Card模型,然后进行迁移、迁移,它应该可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49974647

复制
相关文章
jQuery scroll(滚动)延迟加载
延迟加载 $(window).scroll(function(){ var scrollHeight = $(document).height(); //文档高度 var scrollTop = $(this).scrollTop(); //滚动条卷去高度 var windowHeight = $(this).height(); // 窗口高度 // console.log(scrollHeight, scrollTop, windowHeight) if(scrol
deepcc
2018/05/16
9K0
jQuery进阶,$.Deferred() 延迟对象
JS里面有大量的异步方法,写着写着,代码就会变得>>。多层嵌套的回调,很影响后续代码的维护,也许今天你还记得这块回调逻辑,明天你就很有可能被这回调姿势给坑了。
libo1106
2018/08/08
7970
延迟加载图片的jQuery插件-Lazy Load Plugin for JQuery
Lazy Load是一个用Javascript写得jQuery插件。它可以使一个长网页中,不在当前视图中的图片延迟加载,以提高页面的载入速度。
EltonZheng
2021/01/26
3.7K0
延迟加载图片的 jQuery 插件:Lazy Load
网站的速度非常重要,现在有很多网站优化的工具,如 Google 的 Page Speed,Yahoo 的 YSlow,对于网页图片,Yahoo 还提供 Smush.it 这个工具对图片进行批量压缩,但是对于图片非常多的网站,载入网页还是需要比较长的时间,这个时候我们可以使用 Lazy Load 这个 jQuery 插件来延迟加载图片。
Denis
2023/04/15
1.9K0
如何做到 jQuery-free?
jQuery是现在最流行的JavaScript工具库。 据统计,目前全世界57.3%的网站使用它。也就是说,10个网站里面,有6个使用jQuery。如果只考察使用工具库的网站,这个比例就会上升到惊人的
ruanyf
2018/04/12
1.3K0
如何做到 jQuery-free?
基于jQuery或Zepto的图片延迟加载插件
当我们网站的页面图片过多时,加载速度就会很慢。尤其是用手机2G/3G访问页面,不仅页面慢,而且还会用掉很多流量。我们主题之前也都采用了图片的懒加载形式,但都不完美,部分主题还采用了占位图片来控制懒加载,今天换一种js图片懒加载,它原理就是将页面内所有需要加载的图片全部换成一张默认的图片(一般尺寸很小),只有图片在可视区域才去请求加载,这样的话应该就能满足我们日常所需,好了不说废话先按照教程操作试试,后期主题会逐一更新,稍安勿躁!!!
李洋博客
2022/11/03
3.2K0
使用jQuery的delay()延迟执行show()和hide()不起效的解决方法
今天使用 jQuery 的 delay() 来延迟执行 hide() ,发现延时不起效,查了一些资料,找到了其中的原因。
德顺
2019/11/12
3.3K0
响应式jquery瀑布流结合图片延迟加载特效
此作品是一款非常实用的jquery特效,结合了两个jquery插件jquery瀑布流插件blocksit和图片延迟加载插件jquery.lazyload,网站上分享过很多款瀑布流作品,可是很多网友们都觉得不是很懂,有点复杂,今天有空就把此作品整理了出来分享给大家学习用,如果作品有什么问题请多多反馈。。。
李维亮
2021/07/09
4.9K0
使用jQuery
jQuery概述 Write Less Do More(用更少的代码来完成更多的工作) 使用CSS选择器来查找元素(更简单更方便) 使用jQuery方法来操作元素(解决浏览器兼容性问题、应用于所有元素并施加多个方法) 引入jQuery 下载jQuery的开发版和压缩版 从CDN加载jQuery <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script> window.jQuery ||
用户8442333
2021/05/20
9980
利用Jquery Lazyload JS插件实现网页图片延迟加载
Jquery Lazyload是一款网页图片延迟加载JS插件,本文介绍该JS的使用方法。
阿峰技术博客
2022/10/22
8.5K0
利用Jquery Lazyload JS插件实现网页图片延迟加载
火狐的Http请求插件的安装和使用[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147776.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/02
1.2K0
火狐的Http请求插件的安装和使用[通俗易懂]
一些原生写法可以替代Jquery方法
jQuery的核心是通过各种选择器,选中DOM元素,可以用querySelectorAll方法模拟这个功能。
javascript.shop
2019/09/04
2.1K0
JQuery学习—JQuery-Validation 使用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/121266.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/19
4.6K0
程序员Web面试之jQuery
又到了一年一度的毕业季了,青春散场,却等待下一场开幕。 在求职大军中,IT行业的程序员、码农是工科类大学生的热门选择之一, 尤其是近几年Web的如火如荼,更是吸引了成千上万的程序员投身其中追求自己的梦
葡萄城控件
2018/01/10
2.6K0
程序员Web面试之jQuery
Jquery使用小结
这周都在做前端页面的开发,用了Jquery知识比較多,方便以后使用。就做一个小总结吧。
全栈程序员站长
2022/07/10
5720
jQuery 效果使用
.hide()   隐藏匹配的元素。   .hide()     这个方法不接受任何参数。   .hide([duration][,complete])     duration       一个字符串或者数字决定动画将运行多久。     complete       在动画执行完时执行的函数。   .hide([duration][,easing][,complete])     duration       一个字符串或者数字决定
用户1197315
2018/01/19
6.4K0
jQuery使用技巧
使用回调方法的缺点之一是当执行类库中的方法后,上下文对象被设置到另外一个元素,比如,执行下面代码:
零式的天空
2022/03/22
1.3K0
jQuery的使用
1.需求分析 在首页中(logo的上方)显示一个广告图片(页面加载后,间隔3秒弹出广告图片,再间隔3秒后隐藏广告图片)。【使用jQuery实现】
用户5927264
2019/07/31
8.2K0
golang 使用 rabbitmq 延迟队列
这样类似的场景经常会发生在实际的业务中,它们总有一个共性,就是当前并不是马上触发,而是需要过一段时间才进行触发,当触发时间到达时才进行具体的执行。那么问题就来了,为了实现这样的功能,我们如何更加灵活的实现呢?
LinkinStar
2022/09/01
1.2K0
golang 使用 rabbitmq 延迟队列
点击加载更多

相似问题

将列表与列表字典进行比较的最快方法

315

合并n字典并在2.6上加值的最快方法

13

python基于键匹配合并字典的最快方法

30

比较列表与集合列表的最快方法

22

合并具有公共字段的列表的最快方法?

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文