Skip to main content
 首页 » 编程设计

python之将对象 ID 传递给 URL Django Python

2024年10月24日35jpfss

我是 Django 的新手,所以我很难理解哪些信息与尝试找到我的问题的答案最相关。

我按照教程学习了 Django。该类创建一个购物车。我遇到无法将商品添加到购物车或移除商品的问题。对我来说最可疑的是,当我查看购物车时,在数据库中有一个用于选择书籍的下拉菜单,但它显示的不是书名,而是 Book Object。我相信这是问题所在,但我不确定如何解决它。

我开始想这个问题可能是版本的不同。本教程使用的是更高版本。我正在使用

python 2.7.10 Django 1.9.4

我认为这归结为我的模型和观点

添加到购物车和删除的 URL

url(r'^add/(\d+)', views.add_to_cart, name='add_to_cart'),   
url(r'^remove/(\d+)', views.remove_from_cart, name='remove_from_cart'), 

这是 Cart 和 BookOrder 的模型

   from django.db import models 
from django.utils import timezone 
from django.contrib.auth.models import User 
 
class Author(models.Model): 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 
 
    def __unicode__(self):  
        return "%s, %s" % (self.last_name, self.first_name) 
 
 
def cover_upload_path(instance,filename): 
    return '/'.join(['books',str(instance.id),filename]) 
 
 
class Book(models.Model): 
    title = models.CharField(max_length=200) 
    author = models.ForeignKey(Author) 
    description = models.TextField() 
    publish_date = models.DateField(default=timezone.now) 
    price = models.DecimalField(decimal_places=2, max_digits=8) 
    stock = models.IntegerField(default=0) 
    cover_image = models.ImageField(upload_to=cover_upload_path, default='books/empty_cover.jpg') 
 
class Review(models.Model): 
    book = models.ForeignKey(Book) 
    user = models.ForeignKey(User) 
    publish_date = models.DateField(default=timezone.now) 
    text = models.TextField() 
    latitude= models.FloatField(max_length=20, default="37.41920") 
    longitude= models.FloatField(max_length=20, default="122.8574") 
 
class Cart(models.Model): 
    user = models.ForeignKey(User) 
    active = models.BooleanField(default=True) 
    order_date = models.DateField(null=True) 
    payment_type = models.CharField(max_length=100, null=True) 
    payment_id = models.CharField(max_length=100, null=True) 
 
    def add_to_cart(self, book_id): 
        book = Book.objects.get(pk=book_id) 
        try: 
            preexisting_order = BookOrder.objects.get(book=book, cart=self) 
            preexisting_order.quantity += 1 
            preexisting_order.save() 
        except BookOrder.DoesNotExist: 
            new_order = BookOrder.objects.create( 
                book=book, 
                cart=self, 
                quantity=1 
                ) 
            new_order.save() 
 
    def remove_from_cart(self, book_id): 
        book = Book.objects.get(pk=book_id) 
        try: 
            preexisting_order = BookOrder.objects.get(book=book, cart=self) 
            if preexisting_order.quantity > 1: 
                preexisting_order.quantity -= 1 
                preexisting_order.save() 
            else: 
                preexisting_order.delete() 
        except BookOrder.DoesNotExist: 
            pass 
 
 
class BookOrder(models.Model): 
    book = models.ForeignKey(Book) 
    cart = models.ForeignKey(Cart) 
    quantity = models.IntegerField() 

这里是添加和删除购物车的 View 。

def add_to_cart(request,book_id): 
        if request.user.is_authenticated(): 
            try: 
                book = Book.objects.get(pk=book_id) 
            except ObjectDoesNotExist: 
                pass 
            else : 
                try: 
                    cart = Cart.objects.get(user = request.user, active = True) 
                except ObjectDoesNotExist: 
                    cart = Cart.objects.create(user = request.user) 
                    cart.save() 
                    cart.add_to_cart(book_id) 
                    return redirect('cart') 
                else: 
                    return redirect('index') 
 
 
def remove_from_cart(request, book_id): 
    if request.user.is_authenticated(): 
        try: 
            book = Book.objects.get(pk = book_id) 
        except ObjectDoesNotExist: 
            pass  
        else: 
            cart = Cart.objects.get(user = request.user, active = True) 
            cart.remove_from_cart(book_id) 
        return redirect('cart') 
    else: 
        return redirect('index') 

请您参考如下方法:

为了能够看到对象名称而不是看到模型对象,您需要在模型中定义__unicode__ 方法。

对于您的购物车型号:

class Cart(models.Model): 
    ... 
    [fields] 
    ... 
 
    def __unicode__(self): 
        return "%s's cart" % self.user.username 

通过定义这个,你将能够看到“用户名的购物车”

对于 BookOrder 模型

class BookOrder(models.Model): 
 
    def __unicode__(self): 
        return self.book.name or self.book.title 

通过定义它,您将能够看到像“我的书名”这样的书名。