11

我正在尝试获取当前登录的用户并显示在每个视图的顶部。我已经到处搜索了这个,但我永远找不到我的问题的直接答案。

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

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

4 回答 4

13

在您的通用视图实现中,您需要扩展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

然后,这取决于您的要求,您想用它做什么。

为通用 get_context_data 扩展通用视图类

于 2013-01-20T07:57:01.167 回答
10

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

self.request.user

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

您应该能够在模板中访问它:

{{ request.user }}
于 2013-01-20T07:52:02.127 回答
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

于 2013-01-20T08:40:30.753 回答
0

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

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

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

于 2013-01-20T18:13:31.453 回答