使用Django类视图抓取用户登录的当前用户?

时间:2013-01-20 07:48:59

标签: python django views

我正在尝试抓取当前登录的用户并显示在每个视图的顶部。我为此寻找了所有的地方,但我无法找到解决问题的直接答案。

我能够在表单视图中获取它,但由于某种原因,我无法在普通视图中显示它。这让我疯了。

from django.http import HttpResponse, Http404
from django.views.generic import ListView, DetailView, FormView
from django.template import RequestContext, loader, Context
from django.core.urlresolvers import reverse
from boards.models import Links, LinksCreateForm, Category
from django.contrib.auth.models import User


def get_user(request):
    current_user = request.get.user
    return current_user


class LinksListView(ListView):
    model = Links


class LinksDetailView(DetailView):
    model = Links


class LinksCreateView(FormView):
    template_name = 'boards/link_create.html'
    form_class = LinksCreateForm

    def form_valid(self, form):
        name = form.cleaned_data['name']
        description = form.cleaned_data['description']
        user = self.request.user
        category = Category.objects.get(id=form.cleaned_data['category'].id)
        link = Links(name=name, description=description, user=user, category=category)
        link.save()
        self.success_url = '/boards/'

        return super(LinksCreateView, self).form_valid(form)

4 个答案:

答案 0 :(得分:9)

在通用视图实现中,您需要扩展get_context_data

def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
        c = super(ReqListView, self).get_context_data(**kwargs)
        user = self.request.user
        return c

那么这取决于你的要求你想用它做什么。

Extending generic view classes for common get_context_data

答案 1 :(得分:6)

在您的视图中,您可以访问请求(以及用户):

self.request.user

由于您正在谈论在“视图”的顶部显示它,我相信您希望在模板中访问它。

您应该可以在模板中访问它:

{{ request.user }}

答案 2 :(得分:6)

您可以在settings.py中将'django.core.context_processors.request'添加到TEMPLATE_CONTEXT_PROCESSORS,然后以{{ request.user }}的形式访问当前用户。如果您没有此变量,可以将其添加为:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.request',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.core.context_processors.tz',
    'django.contrib.messages.context_processors.messages'
)

https://docs.djangoproject.com/en/1.4/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

答案 3 :(得分:0)

添加到模板上下文处理器,因为@sneawo指向是最好的方法。但是,我更喜欢不要覆盖默认值,而是扩展它。像这样:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP
# ...
TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)

为什么呢?因为django中的默认上下文处理器列表从版本更改为版本。某些内置/附带的(contrib)库取决于默认设置。一般来说,我认为除非必须,否则最好不要覆盖默认值。