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

Python 用Django类视图抓取当前登录用户?,python,django,views,Python,Django,Views,我试图抓取当前登录的用户并显示在每个视图的顶部。我找遍了所有的地方,但是我始终找不到一个直接的答案来回答我的问题 我可以在表单视图中获取它,但由于某些原因,我无法在普通视图中显示它。它快把我逼疯了 from django.http import HttpResponse, Http404 from django.views.generic import ListView, DetailView, FormView from django.template import RequestContex

我试图抓取当前登录的用户并显示在每个视图的顶部。我找遍了所有的地方,但是我始终找不到一个直接的答案来回答我的问题

我可以在表单视图中获取它,但由于某些原因,我无法在普通视图中显示它。它快把我逼疯了

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)

在视图中,您可以访问请求(因此也可以访问用户):

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

您应该能够通过以下方式在模板中访问它:

{{ request.user }}

在通用视图实现中,需要扩展
get\u context\u 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
那么这取决于你的需求,你想用它做什么


您可以在settings.py中将
'django.core.context\u processors.request'
添加到
模板\u context\u 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'
)

将@sneawo指出的上下文处理器添加到模板中是最好的方法。但是,我宁愿不要覆盖默认设置,而是扩展它。像这样:

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

为什么??因为django中默认上下文处理器的列表会随着版本的变化而变化。某些内置/附带(contrib)库取决于默认设置。一般来说,我认为最好不要覆盖默认值,除非你必须这样做。

这种解决方案并不是真正的django-ish。查看答案sneawo的答案。好的,问题是在视图中为用户提出的,而不是在模板中。sneawo的答案是完美的。这里是最简单的答案。
from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP
# ...
TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)