Джанго - Коулман - PullRequest
       1

Джанго - Коулман

0 голосов
/ 17 декабря 2010

Я новичок в Django, и я начал проект, который должен иметь решение для корзины покупок / электронной коммерции.

Я читал книгу Джесси Легга о электронной коммерции Django 1.2, и яищу кого-то, кто прошел через это в некоторой степени.Я прошу прощения за то, что могу быть недостаточно конкретным в своем вопросе.

После настройки Django-Registration и Django-профилей книга должна показать, как создать рабочую корзину и связать ее с покупателем.Нет проблем.

Где-то в Главе 3 мы создаем заказ, статус моделей заказа и представления для загрузки товаров в корзину.

Я получаю сообщение об ошибке, что мой «Товар»не определен.Единственное место, в котором «Товар» появляется в объекте «Корзина»:

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

Строка41 в представлении «add_to_cart» относится к «cart.add_item (obj, количество)»

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

Поскольку 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(...) также будет работать.

0 голосов
/ 17 декабря 2010

Я не знаю книгу. Но пока кто-то, кто прочитал это может помочь. Вот моя стоимость ватенса.

Ошибка происходит в строке 41 в вашем файле views.py. В файле views.py вы загрузили не 41 строку.

Есть ли в вашем приложении модельный класс Item? Если это так, попробуйте импортировать его вместе с продуктом и корзиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...