3

私のウェブサイトには警告システムがあります。特定のアクションが発生すると、システムは次のモデルでアラートをログに記録します。

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'
4

3 に答える 3

15

get_alertnum()関数から@login_required()デコレータを削除する必要があります。デコレータは、最初の引数がリクエストオブジェクトであると想定し、ユーザー属性にアクセスしようとしています。

また、次の方法で関数を単純化および高速化できます。

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

以下は、カウント方法の説明です。

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

于 2012-08-09T19:59:58.310 に答える
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()
于 2012-08-09T20:04:41.580 に答える