2013-08-12 31 views
7

Tôi đang cố gắng để phá vỡ một số đá bằng cách phát triển một trang web trên của tôi, và tôi đang bắt đầu bằng cách tạo ra một số trang đăng ký và danh sách hồ sơ cơ sở dữ liệu.Tại sao __unicode__ không hoạt động nhưng __str__ làm gì?

Và tôi đang bị lỗi với thực tế là phương pháp __unicode__ không in tên người dùng hồ sơ của tôi và __str__!

Và tôi biết rằng việc sử dụng __unicode__ là phương pháp hay nhất để có, nhưng tôi chỉ có thể in tên người dùng đối tượng của mình bằng __str__.

Ai đó có thể giải thích tại sao điều này xảy ra?

My mẫu:

from django.db import models 

class User(models.Model): 
    username = models.CharField(max_length=200) 
    reg_date = models.DateTimeField('registry date') 

    def __unicode__(self): 
     return self.username 

admin.py của tôi:

from django.contrib import admin 
from registo.models import User 

admin.site.register(User) 

__unicode__(self) đầu ra của tôi:

User 
    User object 

My __str__(self) đầu ra:

User 
    Teste 

Cảm ơn sự hợp tác của bạn trước!

+1

Bạn đang sử dụng phiên bản Django nào? – Sudipta

+0

Xin chào Sudipta! Cảm ơn vì câu trả lời nhanh của bạn! :). Tôi đang sử dụng phiên bản 1.5.1! Cảm ơn – Sammy

Trả lời

11

có vẻ như bạn đang sử dụng Python3.x và đây là relevant documentation on Str and Unicode methods

Trong Python 2, mô hình đối tượng quy định cụ thể __str__()__unicode__() phương pháp. Nếu các phương thức này tồn tại, chúng phải trả về str (byte) và unicode (văn bản) tương ứng.

Lệnh in và lệnh gọi tích hợp str() __str__() để xác định biểu diễn có thể đọc được của một đối tượng. Các unicode() được xây dựng trong cuộc gọi __unicode__() nếu nó tồn tại, và nếu không rơi trở lại __str__() và giải mã kết quả với mã hóa hệ thống. Ngược lại, lớp cơ sở Mô hình tự động xuất phát từ __str__() từ __unicode__() bằng cách mã hóa thành UTF-8.

Trong Python 3, chỉ đơn giản là __str__(), phải trả về str (văn bản).

Vì vậy

Mở Python 3, trang trí là một không-op. Trên Python 2, nó định nghĩa các phương thức thích hợp __unicode__()__str__() (thay thế phương thức gốc __str__() trong quá trình này).

+0

Xin chào Karthikr! Cảm ơn vì câu trả lời nhanh của bạn! :). Vì vậy, vì trong python 3 chỉ đơn giản là __str__, tôi chỉ phải sử dụng nó để in những gì tôi muốn từ các đối tượng, từ bây giờ, đúng không? Cảm ơn bạn đã dán tài liệu ở đây! :) – Sammy

+0

Đúng vậy. Nếu bạn muốn tính tương thích, bạn có thể xem [python_2_unicode_compatible] (https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.encoding.python_2_unicode_compatible) trang trí – karthikr

+0

Ok. Tôi đánh giá cao sự giúp đỡ của bạn! Vì đó là phiên bản "vấn đề", tôi thấy nhẹ nhõm vì đó không phải là vấn đề của tôi :). Cảm ơn sự giúp đỡ của bạn một lần nữa! :) – Sammy

2

Nếu đó không phải là điều python 3, mã của bạn như được đăng có thụt đầu dòng không chính xác - không chắc chắn nếu sao chép/dán lỗi hoặc nếu đó là cách nó có trong mã. Nhưng các phương pháp của mô hình User của bạn cần phải thụt vào, như vậy:

from django.db import models 

class User(models.Model): 
    username = models.CharField(max_length=200) 
    reg_date = models.DateTimeField('registry date') 

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

Sẽ không tham chiếu 'self' bên ngoài một lớp học ném một ngoại lệ? –

+0

Nếu hàm được gọi, chắc chắn. Nhưng như được hiển thị, hàm chỉ được định nghĩa ở cấp mô-đun và đường dẫn mã đó sẽ không bao giờ được gọi. – AdamKG

+0

Xin chào Adam! Cảm ơn vì câu trả lời nhanh của bạn. Vì vậy ... tôi đang sử dụng pyCharm, và tôi đoán định danh là chính xác! Tôi đang tránh sao chép-dán để tìm hiểu thêm, nhưng tôi đã thử với mã của bạn + nhận dạng, nhưng kết quả là như nhau! : /. Cảm ơn sự giúp đỡ! :) – Sammy

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