2013-11-14 4 views
0

Когда я пытаюсь получить данные, используя внешний ключ из другой таблицы я получаю ниже исключение:Джанго: AttributeError

'User' object has no attribute 'UserFeed_set' 

Вид:

def user_page(request, username): 
    try: 
     u = User.objects.get(username=username) 
    except User.DoesNotExist: 
     raise Http404(u'Requested user not found.') 
    feeds = u.UserFeed_set.all() 
    variables = RequestContext(request, { 
     'username' : username, 
     'feeds' : feeds 
    }) 
    return render_to_response('user_page.html', variables) 

models.py:

from django.contrib.auth.models import User 

class AllFeeds(models.Model): 
    url = models.CharField(unique=True, max_length=40) 

    def __unicode__(self): 
     return self.url 

class UserFeed(models.Model): 
    user = models.ForeignKey(User) 
    myfeeds = models.ForeignKey(AllFeeds) 

    def __unicode__(self): 
     return u'%s %s'%(self.user.username,self.link.url) 
+2

попробуйте 'userfeed_set', в противном случае опубликуйте определение для' UserFe ed'. – DanielB

+0

Это не решит вашу проблему (см. Комментарий @ DanielB) - но вы должны использовать ['get_object_or_404'] (https://docs.djangoproject.com/en/1.6/topics/http/shortcuts/#get-object- или-404) - его ярлык, который делает то, что вы здесь делаете, «длинный» путь; проверьте, возвращает ли запрос объект, а затем повысит значение 404. –

+0

@ DanielB Я обновил модели – 88dax

ответ

1

Основная проблема здесь заключается в том, что вам нужно использовать правильный формат имени, который является строчным; но есть некоторые дополнительные проблемы с вашими моделями.

ЧИСТЯЩИЕ ваш код, вы в конечном итоге с этим:

from django.shortcuts import get_object_or_404, render 

def user_page(request, username): 
    u = get_object_or_404(User, username=username) 
    feeds = u.userfeed_set.all() 
    variables = { 
     'username' : username, 
     'feeds' : feeds 
    } 
    return render(request, 'user_page.html', variables) 

Ваши модели также необходимо некоторое редактирование, потому что у вас нет self.link.url:

from django.contrib.auth.models import User 

class AllFeeds(models.Model): 
    url = models.URLField(unique=True, max_length=40) 

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

class UserFeed(models.Model): 
    user = models.ForeignKey(User) 
    myfeeds = models.ForeignKey(AllFeeds) 

    def __unicode__(self): 
     return unicode('{0} {1}'.format(self.user.username, self.myfeeds.url)) 
+0

Пока вы очищаете, вместо ссылки на «Пользователь» вы должны использовать 'settings.AUTH_USER_MODEL' для' ForeignKey 'и [' django.contrib.auth.get_user_model'] (https://docs.djangoproject.com/en /dev/topics/auth/customizing/#django.contrib.auth.get_user_model) при непосредственном обращении к объекту. – DanielB

1

Если вы не имеете в related_name на ForeignKey поле UserFeed модели, ее должен быть доступен как user.userfeed_set. (Имя по умолчанию: model.__name__.lower() + "_set").

Если вы установили releated_name, метод будет называться так, как вы назвали в качестве значения.

0

, как я знаю, если у вас есть две модели, использующие отношение manytomany, вы можете использовать u.userfeed_set.all(), но, как вы сказали, ваши модели используют взаимно однозначное отношение.

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