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 に答える