Django - 科尔曼
我刚开始学习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(...)
也可以用。