2012-08-09 60 views
1

我的网站有一个警报系统。当某个动作时,系统loggs在以下模型警报:Django:'用户'对象没有属性'用户'

class Alert(models.Model): 
    title = models.CharField(max_length=60) 
    read = models.BooleanField #if this is a new alert of not 
    for_user = models.ForeignKey(User) #which user will see it 
    link = models.CharField(max_length=100) 

许多功能需要检查提醒用户拥有的号码(主要是为了显示新警报数量旁边的警报选项卡现场)。正因为如此,我创造了这个功能:

@login_required() 
def get_alertnum(user): 
    alert_objects = Alert.objects.filter(read = False, for_user=user) 
    num = 0 
    for n in alert_objects: 
     num += 1 
    return num 

并通过该功能访问:

@login_required() 
def posting_draft(request): 
    user = request.user 
    user_drafts = Draft.objects.filter(user = user) 
    drafts = dict() 
    for d in user_drafts: 
     drafts[d.title] = d.id 
    alertnum = get_alertnum(user) 
    return render_to_response('posting_draft.html', {'STATIC_URL':STATIC_URL, 'draft_l' : drafts, 'selected':"dr", alertnum: alertnum}) 

,但我得到了以下错误:

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/posting/drafts 

Django Version: 1.4 
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', 
'Knights', 
'django.contrib.admin') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "/Library/Python/2.7/site-packages/Django-1.4-py2.7.egg/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/Library/Python/2.7/site-packages/Django-1.4-py2.7.egg/django/contrib/auth/decorators.py" in _wrapped_view 
    20.     return view_func(request, *args, **kwargs) 
File "/Users/Mike/Desktop/Main/Django-Development/BBN/Knights/views.py" in posting_draft 
    245.  alertnum = get_alertnum(user) 
File "/Library/Python/2.7/site-packages/Django-1.4-py2.7.egg/django/contrib/auth/decorators.py" in _wrapped_view 
    19.    if test_func(request.user): 
File "/Library/Python/2.7/site-packages/Django-1.4-py2.7.egg/django/utils/functional.py" in inner 
    185.   return func(self._wrapped, *args) 

Exception Type: AttributeError at /posting/drafts 
Exception Value: 'User' object has no attribute 'user' 
+0

'@login_reqiured()'应该是'@ login_required' – 2012-08-09 20:09:48

+0

@BurhanKhalid感谢。 – 2012-08-09 20:15:50

回答

10

您需要删除@login_required ()装饰器从get_alertnum()函数。装饰器假定第一个参数是一个请求对象,并试图访问用户属性。你

也可以简化和加速功能:

def get_alertnum(user): 
    return Alert.objects.filter(read=False, for_user=user).count() 

下面是计数方法进行说明。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#count

+0

很好的答案。另一个选项是将它作为'get_alertnum(request,user)'传递。但是你是对的,如果'get_alertnum'不是视图,它不需要视图装饰器。 – jdi 2012-08-09 20:01:47

+0

当函数不使用它时,不需要添加请求参数。 – 2012-08-09 20:05:09

+0

我的意思是如果OP想要保留装饰器,那么你需要传递请求对象作为第一个参数。装饰器将使用它来检查登录,并将用户传递给函数 – jdi 2012-08-09 20:06:33

2

@login_required装饰仅适用于它的第一个参数是请求的功能。您的堆栈跟踪是因为它试图使用user对象,就好像它是一个request对象,并且它不起作用。 (因为对方的回答指出,user对象没有一个.user属性)

也许不是get_alertnum()可以检查user.is_authenticated()第一,并返回0如果用户没有通过认证。

例如:

def get_alertnum(user): 
    if not user.is_authenticated(): 
     return 0 
    else: 
     return Alerts.objects.filter(read=False, for_user=user).count() 
7

当您使用类@login_required装饰这个错误也弹出。对于课堂装修使用@method_decorator(login_required)。查看更多在Class based views docs.

+1

这应该是正确的答案。谢谢! – Dejell 2016-07-11 08:26:32

+0

相同!这应该是正确的答案! – 2017-12-20 13:20:36

相关问题