2013-04-19 4 views
0

Я пытаюсь расширить модель аутентификации django и добавить пользователю специальные поля, используя OneToOneField.Поле Django OneToOne в строковом представлении модели

from django.db import models 
from django.contrib.auth.models import User 


class GastroCustomer(models.Model): 
    user = models.OneToOneField(User) 
    barcode = models.IntegerField() 
    balance = models.IntegerField() 

    def __unicode__(self): 
     return self.user 

Это прекрасно работает вне модуля администратора. Но если теперь я начинаю добавлять новый GastroCustomer через интерфейс администратора я получаю: 'User' object has no attribute '__getitem__'

Если изменить __unicode__(self) на что-то простое, например,

def __unicode__(self): 
    return "foo" 

эта ошибка не возникает. Есть ли способ выяснить, когда это поле пользователя находится в некотором недействительном состоянии и изменить строковое представление для этого случая? Может кто-нибудь представить, почему __unicode__(self) вызывается до того, как запись «правильная»?

ответ

1

Ваша модель фактически возвращает объект модели в __unicode__ методы вместо этого он должен возвращать юникод строки, вы можете сделать это:

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

Это будет вызывать User.__unicode__, которая будет возвращать user.username. Благодаря Nathan Villaescusa на его answer.

В качестве альтернативы вы можете сразу вернуть имя пользователя пользователя в __unicode__ метода:

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

Спасибо это работает. Я думал, что пользовательское поле переадресует вызов «__unicode __() »урока« User-Model ». –

Смежные вопросы