7

これはビューの私のコードです:

@login_required
def get_top(type):
    o = Work.objects.filter(types = "Fan Fiction").order_by("-date_updated")[:10]
    list = []
    for o in o:
        l.title = o.title
        l.href = "/" + o.id
        list.append(l)
    return l

@login_required
def main_home(request):
    fanfiction = get_top("ff")
    poetry = get_top("pw")
    originalwork = get_top("ow")
    return render_to_response("Main/main_home.html", {'STATIC_URL':STATIC_URL, "poetry":poetry, "fan":fanfiction, "original":originalwork})

これはモデルのコードです:

class Work(models.Model):
    title = models.CharField(max_length=30)
    summery = models.TextField()
    user = models.ForeignKey(User)
    date_published = models.DateField()
    date_updated = models.DateField()
    one_shot = models.BooleanField()
    completed = models.BooleanField()
    TYPES = (
        ('FF', 'Fan Fiction'),
        ('OF', 'Original Work'),
        ('PW', 'Poetry Work'),
        )
    types = models.CharField(max_length=2, choices=TYPES)
    fandom1 = models.ForeignKey(Book, blank = True, null= True, related_name='f_1')
    fandom2 = models.ForeignKey(Book, blank = True, null= True, related_name='f_2')
    def __unicode__(self):
    return self.title + '-' + self.user.email

これはエラーです: 'str' object has no attribute 'user'at "get_top("ff")"

4

2 に答える 2

16

メソッド@login_requiredのデコレータを削除してください。get_top

これがしようとしているのは、@login_requiredそのユーザーがログインしているかどうかを確認しようとすることです。これは、スタックトレースであるUserオブジェクトインスタンスを見つけようとしています。通常はobjから取得しますが、それを渡していないため、エラーが発生します。ffstr@login_requiredUserrequestget_top

私の提案はviews.py、API url にリンクされているメソッドの特定のセットを維持するurls.py必要があることです@login_required。他のメソッドのセットはヘルパー メソッドです ( などget_top)。これらは外の世界に公開されていません (したがって は必要ありません@login_required)。

get_top内部と外部の両方に公開する必要がある場合は、最初のパラメーターget_toprequestオブジェクトにし、その後に他のパラメーターを続ける必要があります。

于 2012-11-16T19:23:23.347 に答える
0

get_topはHttpResponseを返さないため、Djangoは@login_requiredデコレータを適切に適用できません(.userプロパティを持つHttpResponseを返すことを前提としています)

于 2013-02-20T19:30:42.640 に答える