首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django:'User‘对象没有'user’属性

Django:'User‘对象没有'user’属性
EN

Stack Overflow用户
提问于 2012-08-10 03:53:57
回答 3查看 21K关注 0票数 3

我的网站有一个警报系统。当发生特定操作时,系统会记录以下模型的警报:

代码语言:javascript
复制
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)

许多功能需要检查用户的警报数量(主要是为了在站点的alerts选项卡旁边显示新警报的数量)。正因为如此,我创建了这个函数:

代码语言:javascript
复制
@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

它可以通过这个函数访问:

代码语言:javascript
复制
@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})

但我得到以下错误:

代码语言:javascript
复制
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'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-10 03:59:58

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

此外,您还可以通过以下方式简化和加快函数的执行速度:

代码语言:javascript
复制
def get_alertnum(user):
    return Alert.objects.filter(read=False, for_user=user).count()

下面是对count方法的解释。

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

票数 15
EN

Stack Overflow用户

发布于 2016-02-18 20:01:14

当你在类上使用@login_required装饰器时,也会出现这个错误。对于类装饰,使用@method_decorator(login_required)。在Class based views docs.中查看更多信息

票数 12
EN

Stack Overflow用户

发布于 2012-08-10 04:04:42

@login_required装饰器只适用于第一个参数是请求的函数。您的堆栈跟踪是因为它试图像使用request对象一样使用user对象,但它不起作用。(正如另一个答案指出的那样,user对象没有.user属性)

也许相反,get_alertnum()可以先检查user.is_authenticated(),如果用户未通过身份验证,则返回0

例如:

代码语言:javascript
复制
def get_alertnum(user):
    if not user.is_authenticated():
        return 0
    else:
        return Alerts.objects.filter(read=False, for_user=user).count()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11890970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档