将request.user传递给视图而不更改URL

时间:2012-12-23 21:06:50

标签: django django-templates django-views

我正在尝试编写一个视图,其中检索当前登录用户的信息。

我的观点如下所示,只要我将用户传递给URL中的视图,它就能完美地运行。

def index(request, username, template="index.html"):

    user = get_object_or_404(User,
                             username__iexact=username)

     expression_qs = Expression.objects.all().order_by('-created')
     album_qs = Album.objects.all().filter(head__isnull=False, is_public=True).order_by('-created')

    user_following = user.relationships.following()

    following_expressions = positive_filter(expression_qs, user_following, 'user')
    following_albums = positive_filter(album_qs, user_following, 'user')
    following_feed = sorted(
        chain(following_albums, following_expressions),
        key=attrgetter('created'), reverse = True)

    return render(request, template, locals())

但是,由于这是主页的视图,我更愿意修改网址。我宁愿(在模板或视图中)描述如果用户登录或未登录会发生什么的逻辑(如果他们已登录,则显示活动源,如果没有,只需返回带有登录的静态页面)形式)。

我的问题是,如何将request.user(但不通过url)传递给视图,以便它返回当前用户的查询集?

3 个答案:

答案 0 :(得分:3)

你真的不需要通过url传递任何东西。您可以直接从request.user访问登录用户。您可以通过here了解此信息。此外,您可以使用is_authentcated()方法或使用login_required装饰器检查用户是否已登录

def ur_view(request):
   #Check if the user is logged in
   if not request.user.is_authenticated():
          #your logic if user not logged in
   else:
        #If the user is logged in

答案 1 :(得分:1)

您需要login_required装饰器。

@login_required
def index(request, template="index.html"):
    user = request.user # get the currently logged in user

如果用户已登录,他/她可以访问活动源,否则他们将被重定向到登录页面。这将确保只有经过身份验证的用户才能访问此view。您始终可以使用request.user访问当前用户。

答案 2 :(得分:0)

登录的用户对象也在请求对象中。使用:request.user

查看django auth docs

中的更多信息