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'在“get_top(“ff”)”

4

2 回答 2

16

请删除方法@login_required的装饰器get_top

这试图做的是,@login_required尝试验证该用户是否已登录。这是试图找到一个User对象实例,ff因此str是堆栈跟踪。通常从obj@login_required获取,但是由于您没有将其传入,因此会出现错误。Userrequestget_top

我的建议是您应该维护一组特定的方法,其中一些方法可能需要views.py链接到 API url 。其他一组方法是辅助方法(如)。这些不暴露于外界(因此不需要)。urls.py@login_requiredget_top@login_required

如果您必须get_top在内部和外部公开,那么您的第一个参数get_top必须是request对象,然后是其他参数。

于 2012-11-16T19:23:23.347 回答
0

get_top 不返回 HttpResponse,因此 Django 无法正确应用 @login_required 装饰器(假设它返回具有 .user 属性的 HttpResponse)

于 2013-02-20T19:30:42.640 回答