2013-01-20 10 views
6

Sto provando a catturare l'utente attualmente connesso e visualizzato nella parte superiore di ogni vista. Ho cercato dappertutto per questo, ma non riesco mai a trovare una risposta diretta per il mio problema.L'utente che ha effettuato il login è stato catturato con le viste di classe Django?

Sono riuscito a visualizzarlo nella vista modulo, ma per qualche motivo non riesco a visualizzarlo in una vista normale. Mi sta facendo impazzire.

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) 

risposta

8

Nell'implementazione vista generico è necessario estendere 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 

Poi dipende dalle vostre esigenze quello che vuoi fare con quello.

Extending generic view classes for common get_context_data

+0

Perfetto, grazie. –

+0

questa soluzione non è davvero django-ish. Vedi la risposta della risposta di sneawo. – migajek

+1

Bene, la domanda ha richiesto l'utente nella vista, non nel modello. la risposta di sneawo è perfetta altrimenti. –

5

All'interno della vostra vista, si ha accesso alla richiesta (e quindi l'utente):

self.request.user 

Dal momento che si sta parlando di visualizzarlo nella parte superiore di una 'visione', ti credo stanno volendo accedervi nel modello.

Dovreste essere in grado di accedervi nel modello come:

{{ request.user }} 
+0

La risposta più semplice qui. – Zeretil

6

È possibile aggiungere 'django.core.context_processors.request' a TEMPLATE_CONTEXT_PROCESSORS in settings.py e quindi l'accesso degli utenti corrente come {{ request.user }}. Se non hai questa variabile, è possibile aggiungerlo come:

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

aggiungendo ai processori di contesto modello come @sneawo punte è il modo migliore per andare. tuttavia, preferisco non sovrascrivere i valori predefiniti, ma a estendere it. Come questo:

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

Perché? Perché l'elenco dei processori di contesto predefiniti in Django cambia da versione a versione. Alcune librerie incorporate/fornite con (contrib) dipendono dalle impostazioni predefinite. In generale, credo che sia meglio non ignorare le impostazioni predefinite a meno che non sia necessario.

Problemi correlati