2010-05-11 35 views
8

Tôi đang làm việc qua số Django tutorials và giờ tôi đang tạo cuộc thăm dò ý kiến.Mô hình Cuộc thăm dò Django

Đoạn code dưới đây hoạt động tốt cho đến khi tôi muốn tạo ra sự lựa chọn, mà vì một lý do tôi luôn luôn nhận được thông báo lỗi này:

line 22, in __unicode__ 
return self.question 

AttributeError: 'Choice' object has no attribute 'question' 

Tôi đang làm gì sai?

Dưới đây là mã của tôi:

import datetime 
from django.db import models 

class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

    def __unicode__(self): 
     return self.question 

    def was_published_today(self): 
     return self.pub_date.date() == datetime.date.today() 



class Choice(models.Model): 
    poll = models.ForeignKey(Poll) 
    choice = models.CharField(max_length=200) 
    votes = models.IntegerField() 

    def __unicode__(self): 
     return self.question # this is line 22 

Trả lời

10

Phương pháp __unicode__ trên mô hình Choice nên giống như thế:

def __unicode__(self): 
    return self.poll.question 

question thuộc tính không tồn tại trên mô hình Choice, bạn cần phải tiếp cận với nó trên poll lĩnh vực then chốt của nước ngoài.

Đừng quên xem tài liệu tuyệt vời của Django cho thấy nhiều ví dụ on how to handle many to one relationships.

Sửa

Nó có lẽ sẽ có ý nghĩa hơn đối với return self.choice trong Choice mô hình phương pháp __unicode__ để nó ra lựa chọn thực tế không phải là câu hỏi Thăm dò ý kiến.

def __unicode__(self): 
    return self.choice 
+0

tôi đã làm điều đó và bây giờ tôi nhận được những phản ứng: >>> Poll.objects.all() [] >>> Poll.objects.get (pk = 1) >>> p = Poll.objects.get (pk = 1) >>> p.choice_set.all() [, ] >>> p.choice_set.create (choice = 'Không nhiều', phiếu = 0) >>> nó không nên có sự lựa chọn ngay từ đầu, bởi vì tôi đã không đặt bất kỳ sự lựa chọn. Cảm ơn bạn đã liên kết tài liệu! Tôi sẽ kiểm tra. – MacPython

+0

True, tôi đoán nó sẽ là ngớ ngẩn để có một cái gì đó như 'return self.poll.question' cho đầu ra, hãy thử' return self.choice' –

+0

Cảm ơn câu trả lời! Tôi không thể nói chắc chắn nếu return.self.choice là giải pháp vì vì một số lý do khác mà main_page sẽ không hiển thị ngay bây giờ. Vì vậy, tôi phải giải quyết và đóng câu hỏi này ngay bây giờ. Cảm ơn một lần nữa! Đây là trang web tốt nhất mà tôi đã gặp cho đến nay. Thực sự hữu ích! – MacPython

4

Nó nên là:

def __unicode__(self): 
    return self.poll.question 

Bởi vì cuộc bình chọn là một mô hình có liên quan có chứa các câu hỏi.

7

Để theo dõi câu trả lời đố tên, những hướng dẫn thực sự nói thêm lợi nhuận khác nhau cho mỗi mô hình:

class Poll(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.question 

class Choice(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.choice 

Bạn có 'self.question' như sự trở lại cho cả hai - Tôi đang nghĩ đến bạn đã thực hiện cùng một lỗi sao chép/dán mà tôi đã làm, hoặc hướng dẫn trước đây đã có lỗi đó ;-)

+1

Đây thực sự là câu trả lời "đúng" dựa trên hướng dẫn. Bạn không chắc chắn lý do tại sao bạn muốn trả lại văn bản câu hỏi của cuộc thăm dò khi in một cá thể lựa chọn. – threejeez

1

Điều này là do lỗi bộ não người hoặc lỗi sao chép/dán. Chúng tôi/Bạn nghĩ rằng cả hai chức năng đều giống nhau và sao chép cùng một mã cho cả hai, nhưng có một từ khác nhau trong cả hai.

thay question để choice trong dòng 22

Các vấn đề liên quan