Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django添加到购物车和购物车视图错误_Python_Django_Django Signals_Django Sessions - Fatal编程技术网

Python Django添加到购物车和购物车视图错误

Python Django添加到购物车和购物车视图错误,python,django,django-signals,django-sessions,Python,Django,Django Signals,Django Sessions,当我通过scan_to_cart视图将一个对象添加到购物车并希望添加第二个对象时,我得到一个“NoneType”对象不可编辑错误。当我想查看购物车时,如果购物车中确实有对象,我也会遇到同样的错误。 我找不到解决方案的常见问题。。。我使用的是python版本,还是存在逻辑或代码错误 提前感谢您的建议/建议 型号: from manageinv.models import Child User = settings.AUTH_USER_MODEL class CartManager(models

当我通过scan_to_cart视图将一个对象添加到购物车并希望添加第二个对象时,我得到一个“NoneType”对象不可编辑错误。当我想查看购物车时,如果购物车中确实有对象,我也会遇到同样的错误。 我找不到解决方案的常见问题。。。我使用的是python版本,还是存在逻辑或代码错误

提前感谢您的建议/建议

型号:

from manageinv.models import Child

User = settings.AUTH_USER_MODEL

class CartManager(models.Manager):  
    def new_or_get(self, request):
        cart_id = request.session.get("cart_id", None)
        qs = self.get_queryset().filter(id=cart_id)
        if qs.count() == 1:
            new_obj = False
            cart_obj = qs.first()
            if request.user.is_authenticated() and cart_obj.user is None:
                cart_obj.user = request.user
                cart_obj.save()
        else:
            cart_obj = Cart.objects.new(user=request.user)
            new_obj = True
            request.session['cart_id'] = cart_obj.id
            return cart_obj, new_obj

    def new(self, user=None):
        user_obj = None
        if user is not None:
            if user.is_authenticated():
                user_obj = user
        return self.model.objects.create(user=user_obj)


class Cart(models.Model):
    user        = models.ForeignKey(User, null=True, blank=True)
    products    = models.ManyToManyField(Child, blank=True)
    subtotal    = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    total       = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    updated     = models.DateTimeField(auto_now=True)
    timestamp   = models.DateTimeField(auto_now_add=True)

    objects = CartManager()

    def __str__(self):
        return str(self.id)


def m2m_changed_cart_receiver(sender, instance, action, *args, **kwargs):
    if action == 'post_add' or action == 'post_remove' or action == 'post_clear':
        products = instance.products.all()
        total = 0 
        for x in products:
            total += x.retail_price
        if instance.subtotal != total:
            instance.subtotal = total
            instance.save()

m2m_changed.connect(m2m_changed_cart_receiver, sender=Cart.products.through)

def pre_save_cart_receiver(sender, instance, *args, **kwargs):
    instance.total = instance.subtotal

pre_save.connect(pre_save_cart_receiver, sender=Cart)   
观点:

def cart_home(request):
cart_obj, new_obj = Cart.objects.new_or_get(request)
products = cart_obj.products.all()
return render(request, 'stockscan/scan_session.html', {"cart":
cart_obj})

def scan_to_cart(request):
    form = forms.ScanSessionForm()
    if request.method == 'POST':
        product = None
        barcode = request.POST.get('barcode_input')
        queryset = Child.objects.filter(product_id_code=barcode)
        if queryset.exists():
            try:
                # the queryset is already filtered by the barcode
                # now we apply an extra filter to check if this user has the product
                product = queryset.get(user=request.user)
            except Child.DoesNotExist:
                # here we are sure this product exists, but this user doesnt have it in the stock.
                messages.error(request, 'I can\'t find any inventory with this barcode')
        else:
            # here we know this product doesnt exist
            messages.error(request, 'I can\'t find any inventory with this barcode')
        if product is not None:
            form = forms.ScanSessionForm(request.POST, instance=product)
            if form.is_valid():
                #####
                #ADD TO CART
                print(product.id)
                product_obj = product.id
                cart_obj, new_obj = Cart.objects.new_or_get(request)
                products = cart_obj.products.all()
                cart_obj.products.add(product_obj)
                #####
                messages.success(request, '%s - %s was successfully added to cart' % (product.product_name, product.sku))   
                return HttpResponseRedirect('/scan/stock/')
    else:
        form = forms.ScanSessionForm()
    return render(request, 'stockscan/scan_to_cart.html', {'form': form})
模板:

{% if cart.products.exists %}
<table class="table">
  <thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">Product Name</th>
      <th scope="col">Product Price</th>
    </tr>
  </thead>
  <tbody>
    {% for product in cart.products.all %}
    <tr>
      <th scope="row">{{ forloop.counter }}</th>
      <td>{{ product.product_name }} <small><a href="#">Remove</a></small></td>
      <td>{{ product.retail_price }}</td>
    </tr>
    {% endfor %}
    <tr>
      <td colspan="2"></td>
      <td><b>Subtotal</b>  {{ cart.subtotal }}</td>
    </tr>
    <tr>
      <td colspan="2"></td>
      <td><b>Total</b> {{ cart.total }}</td>
    </tr>
  </tbody>
</table>
{% else %}
Cart is empty
<p>
{% endif %}
回溯:

Environment:


Request Method: POST
Request URL: http://localhost:8000/scan/stock/

Django Version: 1.11
Python Version: 2.7.10
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'mathfilters',
 'bootstrapform',
 'colorfield',
 'gunicorn',
 'crispy_forms',
 'storages',
 'manageinv',
 'categories',
 'stockscan',
 'orderstock',
 'accounts']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

    File "/Users/sp_env/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
      41.             response = get_response(request)

    File "/Users/sp_env/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
      187.                 response = self.process_exception_by_middleware(e, request)

    File "/Users/sp_env/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
      185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

    File "/Users/sp_env/stockpilot/src/stockscan/views.py" in scan_to_cart
      41.               cart_obj, new_obj = Cart.objects.new_or_get(request)

    Exception Type: TypeError at /scan/stock/
    Exception Value: 'NoneType' object is not iterable

在Cart.new_或_get中,此处:

if qs.count() == 1:
   # ...
else:
   # ...
   return cart_obj, new_obj
如果存在购物车,则不会返回任何内容,因此函数最终将不返回任何内容,这确实是不可编辑的,因此当尝试在此处的视图中解包结果时:

 cart_obj, new_obj = Cart.objects.new_or_get(request)
你会得到这个例外

TL;DR:您应该取消对return语句的登入,以便它对两个分支都执行


这就是说,您的Cart.new_或_get方法显然是错误的-模型代码不应依赖于请求,会话等。所有这些代码都应该存在于您的视图中(如果这是它唯一使用的位置),或者作为实用程序函数,或者作为模型的代理存在于实用程序类中。

第41行scan_to_cart中的/Users/sp_env/stockpilot/src/stockscan/views.py是什么?这一个cart_obj,new_obj=cart.objects.new_或_getrequestHi Bruno,非常感谢您的快速回复。这对我来说很清楚。我将深入探讨这个完全错误的方法。目前,这对我来说都是一条学习之路,最好好好学习:-
 cart_obj, new_obj = Cart.objects.new_or_get(request)