2013-01-20 11 views
6

Próbuję pobrać aktualnie zalogowanego użytkownika i wyświetlić go u góry każdego widoku. Szukałem tego w każdym miejscu, ale nie mogę znaleźć prostej odpowiedzi na mój problem.Pobieranie bieżącego zalogowanego użytkownika z widokami klas Django?

Udało mi się uzyskać go w widoku formularza, ale z jakiegoś powodu nie mogę wyświetlić go w widoku normalnym. To doprowadza mnie do szału.

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) 

Odpowiedz

8

W swojej generycznej implementacji widoku trzeba będzie przedłużyć 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 

Wtedy to zależy od wymagań co chcesz z tym zrobić.

Extending generic view classes for common get_context_data

+0

Działa perfekcyjnie, dzięki. –

+0

to rozwiązanie nie jest tak naprawdę django-ish. Zobacz odpowiedź sneawo na odpowiedź. – migajek

+1

Dobrze pytanie zadawane użytkownikowi w widoku, a nie w szablonie. Odpowiedź sneawo jest doskonała inaczej. –

5

W swoim zdaniem, masz dostęp do wniosku (a zatem użytkownika):

self.request.user 

Skoro mówisz wyświetlając go na szczycie „View”, wierzę ci chcą uzyskać do niego dostęp w szablonie.

Powinieneś być w stanie uzyskać do niego dostęp w szablonie jako:

{{ request.user }} 
+0

Najprostsza odpowiedź tutaj. – Zeretil

6

Możesz dodać 'django.core.context_processors.request' do TEMPLATE_CONTEXT_PROCESSORS w settings.py i następnie uzyskać dostęp do bieżącego użytkownika jako {{ request.user }}. Jeśli nie masz tej zmiennej, można go dodać jako:

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

0

dodanie do procesorów kontekstowych szablon jako @sneawo szpiczasty jest najlepszym sposobem, aby przejść. jednak wolę, aby nie przesłaniać wartości domyślnych, ale do rozszerzyć go. W ten sposób:

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

Dlaczego? Ponieważ lista domyślnych procesorów kontekstowych w django zmienia się z wersji na wersję. Niektóre wbudowane/wysłane z bibliotekami (contrib) zależą od ustawień domyślnych. Ogólnie uważam, że lepiej nie przesłonić wartości domyślnych, chyba że musisz.

Powiązane problemy