2016-03-22 16 views
2

私はDjangoの新機能ですので、私の質問に対する答えを見つけようとするには、どの情報が最も関連性が高いのか理解しにくいです。URLにオブジェクトIDを渡すDjango Python

私はDjangoを学ぶチュートリアルに従いました。クラスはショッピングカートを作成します。ショッピングカートに商品を追加したり、商品を取り除いたりすることができないという問題があります。私には疑わしいと思われる主な事は、カートを見るとデータベースを選択するとドロップダウンしますが、本の名前の代わりにBook Objectと書かれています。私はこれが問題だと思っていますが、トラブルシューティングの方法がわかりません。
enter image description here

私はこの問題がバージョンの違いかもしれないと考え始めています。このチュートリアルでは、それ以降のバージョンを使用しています。私は

のpython 2.7.10 ジャンゴを使用しています1.9.4

私はこれがカートに追加し、ここで

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

を削除するには、私のモデルと私の見解

URLに降りてくると仮定カートとブックオーダーのモデルです

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() 

ここで私は■カートに追加したりカートから取り外すためのビュー。

答えて

1

、あなたはあなたのモデルに__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 

については、 "ユーザ名のカート"

を確認することができます「My Book name」のような本の名前を見ることができます。

+0

私のモデルにはユニコードメソッドがありました。私は完全なモデルで質問を更新しました。 – wuno

+0

'__unicode__'メソッドは' Author'モデルでのみ使用できます。すべてのモデルで定義する必要があります。 – v1k45

+0

ああありがとうございます。私が持っているのと同じことは?毎回それを各方法にコピーしますか?より良い質問。私は何を得ているのですか?だから、私は本IDが必要です。私は必要self.book_id – wuno

1

__str__()または__unicode__()メソッドをモデルに追加します。このメソッドは、オブジェクトの文字列表現が必要なときはいつでも呼び出されます。あなたがドロップダウンメニューに選択肢として表示している間に表示されます。

あなたに合った任意の文字列を返すことができます。

サンプル:代わりにModel objectを見てのオブジェクト名を見ることができることについては

class Cart(models.Model): 
    ... 
    def __str__(self,): 
     return str(self.id) 
     #OR 
     return str(self.user)+str(self.id) 
+0

私のモデルにはユニコードメソッドがありました。私は完全なモデルで質問を更新しました。 – wuno

+0

@wuno、Python2でユニコードをサポートするクラスをデコレートすることができます。何かdjango 1.9で変更されました。また、 '__str__'メソッドを追加してみてください。ref https://docs.djangoproject.com/en/1.9/ref/models/instances/#str – Rohan

+0

大変ありがとうございました。 __str__とunicodeの違いについて説明できますか?ユニコードは作者の名前のために働くので、私はstrを必要としないと仮定しますが、私は調べようとしています。しかし、将来の参照のために、なぜあなたはここでそれを使うことを提案しますか? – wuno

関連する問題