Django - 科尔曼

0 投票
2 回答
793 浏览
提问于 2025-04-16 08:40

我刚开始学习Django,正在做一个购物车/电子商务的项目。

我在看Jesse Legg写的Django 1.2电子商务书,想找一个也看过这本书的人来交流一下。抱歉,我的问题可能不够具体。

在设置好Django-registration和Django-profiles后,书里接下来讲的是如何创建一个可用的购物车,并把它和顾客关联起来。这部分没问题。

在第三章的某个地方,我们创建了订单和订单状态的模型,以及加载产品到购物车的视图。

但我遇到了一个错误,提示我的“Item”没有定义。实际上,“Item”只在购物车对象中出现过:

class Cart(object):
    class Item(object):
        def __init__(self, itemid, product, quantity=1):
            self.itemid = itemid
            self.product = product
            self.quantity = quantity

    def __init__(self):
        self.items = list()
        self.unique_item_id = 0

    def _get_next_item_id(self):
        self.unique_item_id += 1
        return self.unique_item_id
    next_item_id = property(_get_next_item_id)

    def add_item(self, product, quantity=1):
        item = Item(self.next_item_id, product, quantity)
        self.items.push(item)

    def is_empty(self):
        return self.items == []

    def empty(self):
        self.items = list()

    def remove_item(self, itemid):
        self.items = filter(lambda x: x.itemid != itemid, self.items)

    def __iter__(self):
        return self.forward()

    def forward(self):
        current_index = 0
        while (current_index < len(self.items)):
            item = self.items[current_index]
            current_index += 1
            yield item

(谢谢你,vicvicvic) 这是我正在处理的代码。

模型部分:

class Order(models.Model):
...
    customer = models.ForeignKey(User, blank=True, null=True)
    status_code = models.ForeignKey('StatusCode')
    date_placed = models.DateTimeField()
    total_price = models.DecimalField(max_digits=7, decimal_places=2)
    comments = models.TextField(blank=True)
    products = models.ManyToManyField(Product, through='ProductInOrder')
...


class ProductInOrder(models.Model):
...
    order = models.ForeignKey(Order)
    product = models.ForeignKey(Product)
    unit_price = models.DecimalField(max_digits=7, decimal_places=2)
    quantity = models.PositiveIntegerField()
    total_price = models.DecimalField(max_digits=7, decimal_places=2)
    comments = models.TextField(blank=True)
...

class StatusCode(models.Model):
...
    short_name = models.CharField(max_length=10)
    name = models.CharField(max_length=300)
    description = models.TextField()
...

相关的视图:

from django.http import Http404
from django.shortcuts import render_to_response
from django.template import RequestContext
from coleman.orders.cart import Cart
from coleman.products.models import Product

def lookup_object(queryset, object_id=None, slug=None, slug_field=None):
    if object_id is not None:
        obj = queryset.get(pk=object_id)
    elif slug and slug_field:
        kwargs = {slug_field: slug}
        obj = queryset.get(**kwargs)
    else:
        raise Http404
    return obj

def get_shopping_cart(request, cart_class=Cart):
    return request.session.get('cart', None) or cart_class()

def update_shopping_cart(request, cart):
    request.session['cart'] = cart

def shopping_cart(request, template_name='orders/shopping_cart.html'):
    cart = get_shopping_cart(request)
    ctx = {'cart': cart}
    return render_to_response(template_name, ctx, context_instance=RequestContext(request))


def add_to_cart(request, queryset, object_id=None, slug=None, slug_field='slug', template_name='orders/add_to_cart.html'):
...
    obj = lookup_object(queryset, object_id, slug, slug_field)
    quantity = request.GET.get('quantity', 1)
    cart = get_shopping_cart(request)
    cart.add_item(obj, quantity)
    update_shopping_cart(request, cart)
    ctx = {'object': obj, 'cart': cart}
    return render_to_response(template_name, ctx, context_instance=RequestContext(request))
...

def remove_from_cart(request, cart_item_id, template_name='orders/remove_from_cart.html'):
...
    cart = get_shopping_cart(request)
    cart.remove_item(cart_item_id)
    update_shopping_cart(request, cart)
    ctx = {'cart': cart}
    return render_to_response(template_name, ctx,
                              context_instance=RequestContext(request))

def checkout(request, template_name='orders/checkout.html'):

    cart = get_shopping_cart(request)
    googleCart, googleSig = doGoogleCheckout(cart)
    ctx = {'cart': cart,
           'googleCart': googleCart,
           'googleSig': googleSig,
           'googleMerchantKey': settings.GOOGLE_MERCHANT_KEY,
           'googleMerchantID': settings.GOOGLE_MERCHANT_ID}
    return render_to_response(template_name, ctx, context_instance=RequestContext(request))

还有我的产品详情页面:

{% block content %}

    <h1>{{ object.name }}</h1>
    <p>{{ object.description }}</p>
    <p>Price: ${{ object.price_in_dollars }}</p>
    {% for detail in object.details.all %}
    {% if forloop.first %}<p>Additional details:</p>{% endif %}
    <li>{{ detail.attribute.name }}: {{ detail.value }}</li>
    {% endfor %}
    <hr/>

 <form action="/orders/cart/add/{{ object.slug }}/" method="POST">{% csrf_token %}
  <input name="item_name_1" type="hidden" value="{{ object.name }}"/>
  <input name="item_description_1" type="hidden" value="{{ object.description }}"/>
  <input name="item_quantity_1" type="hidden" value="1"/>
  <input name="item_price_1" type="hidden" value="0.5"/>
  <input name="item_currency_1" type="hidden" value="USD"/>
  <input name="_charset_" type="hidden" value="utf-8"/>
  <input type="submit" value="Add To Cart">
 </form>

<p><a href="{% url product_list %}">Back to product list</a></p>
 {% endblock %}

我遇到的错误是:

global name 'Item' is not defined
Exception Location: .../ecommerce_book/coleman/orders/views.py in add_to_cart, line 41

在视图“add_to_cart”的第41行提到了“cart.add_item(obj, quantity)”

谢谢。

2 个回答

0

我不知道这本书。不过在有读过它的人能帮忙之前,我来发表一下我的看法。

错误发生在你上传的views.py文件的第41行。可你上传的views.py文件里并没有41行。

你的应用里有没有一个叫Item的模型类?如果有的话,试着把它和Product、Cart一起导入。

1

因为 Item 是放在 Cart 里面的,所以你需要提供正确的范围。把 add_item 改成:

def add_item(self, product, quantity=1):
        item = Cart.Item(self.next_item_id, product, quantity)
        self.items.push(item)

另外, self.Item(...) 也可以用。

撰写回答