2012-10-25 14 views
13

Im uzyskiwanie błądBłąd typu 'X' nie ma atrybutu '__getitem__'

'CampSite' object has no attribute '__getitem__' 

kiedy zapisać nowy wpis CampCon w interfejsie administratora. Mam jedną aplikację o nazwie kempingi, które obsługują bazę danych kempingów, i mam kolejną aplikację o nazwie content, która obsługuje recenzje. Jestem bardzo nowy w Django i jest to mój pierwszy nie oparty na tutorialu projekt. Odkładałem swój mózg i przeszukiwałem sieć, szukając odpowiedzi bez powodzenia. Z góry dziękuję za Twoją pomoc. Oto mój kemping model:

from django.contrib.gis.db import models 

class CampSite(models.Model): 
    name = models.CharField(max_length=250) 
    showers = models.BooleanField() 
    flush = models.BooleanField() 
    rv = models.BooleanField() 
    lonlat = models.PointField(null=True, blank=True) 

    objects = models.GeoManager() 

    def __unicode__(self): 
     return self.name 

Oto model zawartości:

from django.contrib.gis.db import models 
from campsites.models import CampSite 
from django.contrib.auth.models import User 
from activities.models import Activities 


class CampCon(models.Model): 
    campsite = models.ForeignKey(CampSite) 
    trip = models.ForeignKey('Trip') 
    Date = models.DateField() 
    user = models.ForeignKey(User) 
    overall_review = models.TextField() 
    facilities_review = models.IntegerField() 
    things_to_do = models.IntegerField() 
    privacy = models.IntegerField() 
    beauty = models.IntegerField() 
    overall_rating = models.IntegerField() 

    def __unicode__(self): 
     return self.campsite 

class ImageDB(models.Model): 
    campsite = models.ForeignKey(CampSite) 
    user = models.ForeignKey(User) 
    description = models.CharField(max_length=200) 
    image = models.ImageField(upload_to='/home/bobby/Pictures/CampThat') 
    date_uploaded = models.DateField() 
    date_taken = models.DateField() 
    trip = models.ForeignKey('Trip') 
    activity = models.ForeignKey(Activities) 

    def __unicode__(self): 
     return self.campsite 

class Trip(models.Model): 
    date = models.DateField() 
    description = models.CharField(max_length=100) 
    title = models.CharField(max_length=100) 
    blog = models.TextField() 

    def __unicode__(self): 
     return self.title 

class ActivityCon(models.Model): 
    trip = models.ForeignKey(Trip) 
    rating = models.IntegerField() 
    overall_review = models.TextField() 
    activity = models.ForeignKey(Activities) 

A oto pełna Traceback:

Environment: 


Request Method: POST 
Request URL: http://localhost:8000/admin/content/campcon/add/ 

Django Version: 1.5 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'campsites', 
'auth', 
'trips', 
'content', 
'activities', 
'django.contrib.admin') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    116.       response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper 
    367.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "/usr/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "/usr/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func 
    89.   response = view_func(request, *args, **kwargs) 
File "/usr/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner 
    202.    return view(request, *args, **kwargs) 
File "/usr/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper 
    25.    return bound_func(*args, **kwargs) 
File "/usr/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "/usr/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func 
    21.     return func(self, *args2, **kwargs2) 
File "/usr/lib/python2.7/site-packages/django/db/transaction.py" in inner 
    208.     return func(*args, **kwargs) 
File "/usr/lib/python2.7/site-packages/django/contrib/admin/options.py" in add_view 
    958.     self.log_addition(request, new_object) 
File "/usr/lib/python2.7/site-packages/django/contrib/admin/options.py" in log_addition 
    525.    action_flag  = ADDITION 
File "/usr/lib/python2.7/site-packages/django/contrib/admin/models.py" in log_action 
    18.   e = self.model(None, None, user_id, content_type_id, smart_text(object_id), object_repr[:200], action_flag, change_message) 

Exception Type: TypeError at /admin/content/campcon/add/ 
Exception Value: 'CampSite' object has no attribute '__getitem__' 

Odpowiedz

29

Twój problem jest to, że funkcje __unicode__ wracają obiekty modelu, gdy muszą zwracać ciągi znaków Unicode.

Można to osiągnąć poprzez dodanie funkcji unicode() do swoich metod __unicode__:

class CampCon(models.Model): 
    campsite = models.ForeignKey(CampSite) 
    trip = models.ForeignKey('Trip') 
    Date = models.DateField() 
    user = models.ForeignKey(User) 
    overall_review = models.TextField() 
    facilities_review = models.IntegerField() 
    things_to_do = models.IntegerField() 
    privacy = models.IntegerField() 
    beauty = models.IntegerField() 
    overall_rating = models.IntegerField() 

    def __unicode__(self): 
     return unicode(self.campsite) 

class ImageDB(models.Model): 
    campsite = models.ForeignKey(CampSite) 
    user = models.ForeignKey(User) 
    description = models.CharField(max_length=200) 
    image = models.ImageField(upload_to='/home/bobby/Pictures/CampThat') 
    date_uploaded = models.DateField() 
    date_taken = models.DateField() 
    trip = models.ForeignKey('Trip') 
    activity = models.ForeignKey(Activities) 

    def __unicode__(self): 
     return unicode(self.campsite) 

ten wezwie CampSite.__unicode__ który powróci campsite.name.

+0

Dziękujemy! właśnie mnie uratowałeś. –

2

Zastosowanie tej metody zamiast:

def __unicode__(self): 
     return unicode(self.campsite) 
0

Dzieje się tak również, jeśli robisz to tak:

event_name = CharField(max_length = 250) 

i nie podoba: (we właściwy sposób)

event_name = models.CharField(max_length = 250) 

może być pomocna komuś

0

Ponieważ jest to pierwsze trafienie w Google: Mam podobny błąd ('ItemGroup' object has no attribute '__getitem__'), gdy w następujący sposób:

class ItemGroup(models.Model): 
    groupname = models.CharField(max_length=128) 

    def __unicode__(self): 
     return "%s" % self.groupname 

class Item(models.Model): 
    name = models.CharField(max_length=128) 
    group = models.ForeignKey(MedGroup, verbose_name="Groep") 

    def __unicode__(self): 
     return "%s (%s)" % (self.name, self.group[:10]) 

Ostatni wiersz jest źle.

Naprawiono, zamieniając tę ​​linię na return "%s (%s)" % (self.name, self.group.groupname[:10])

Powiązane problemy