2013-01-20 29 views
6

Tôi đang cố gắng lấy người dùng hiện đã đăng nhập và hiển thị ở đầu mỗi chế độ xem. Tôi đã tìm kiếm tất cả các nơi cho điều này, nhưng tôi không bao giờ có thể tìm thấy một câu trả lời thẳng cho vấn đề của tôi.Nắm bắt người dùng đăng nhập hiện tại bằng chế độ xem lớp Django?

Tôi có thể lấy nó ở dạng xem biểu mẫu, nhưng vì một lý do nào đó tôi không thể hiển thị nó ở chế độ xem bình thường. Nó làm tôi khốn khổ.

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) 

Trả lời

8

Thực hiện quan điểm chung của bạn, bạn sẽ cần phải mở rộng 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 

Sau đó, nó phụ thuộc vào yêu cầu của bạn những gì bạn muốn để làm điều đó.

Extending generic view classes for common get_context_data

+0

Làm việc hoàn hảo, cảm ơn. –

+0

giải pháp đó không thực sự là django-ish. Xem câu trả lời của câu trả lời sneawo. – migajek

+1

Câu hỏi được đặt ra cho người dùng trong chế độ xem chứ không phải trong mẫu. câu trả lời của sneawo là hoàn hảo khác. –

5

Trong tầm nhìn của bạn, bạn có thể truy cập theo yêu cầu (và do đó người sử dụng):

self.request.user 

Vì bạn đang nói về hiển thị nó ở phía trên cùng của một 'View', tôi tin bạn đang muốn truy cập vào nó trong mẫu.

Bạn sẽ có thể truy cập vào nó trong mẫu của bạn như:

{{ request.user }} 
+0

Câu trả lời dễ nhất tại đây. – Zeretil

6

Bạn có thể thêm 'django.core.context_processors.request' để TEMPLATE_CONTEXT_PROCESSORS trong settings.py và sau đó truy cập người dùng hiện hành như {{ request.user }}. Nếu bạn chưa có biến này, bạn có thể thêm nó như là:

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

thêm vào bộ vi xử lý mẫu bối cảnh như @sneawo nhọn là cách tốt nhất để đi. tuy nhiên, tôi thích không được ghi đè lên các giá trị mặc định nhưng phải mở rộng. Như thế này:

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

Tại sao? Bởi vì danh sách các bộ xử lý ngữ cảnh mặc định trong thay đổi django từ phiên bản này sang phiên bản khác. Một số thư viện tích hợp/vận chuyển với (contrib) phụ thuộc vào các thiết lập mặc định. Nói chung, tôi tin rằng tốt hơn là không nên ghi đè các giá trị mặc định trừ khi bạn phải làm như vậy.

Các vấn đề liên quan