2012-04-15 32 views
9

Theo quan điểm của tôi, tôi có thể in request.user.username, tuy nhiên trong mẫu, {{request.user.username}} không xuất hiện. Để thực hiện điều này dễ dàng, tôi đã xóa logic khỏi hàm và tôi đang nhập render_to_response & RequestContext.Django 1.4 - {{request.user.username}} không hiển thị theo mẫu

from django.shortcuts import render_to_response 
from django.template import RequestContext 

@login_required 
@csrf_protect 
def form(request): 
    print request.user.username 
    data = {} 
    return render_to_response('form.html', data, context_instance=RequestContext(request)) 

Tôi đoán là tôi gặp sự cố với settings.py của mình.

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
    'django.contrib.admindocs', 
    'src', 
) 

Cảm ơn trước cho Help- bạn

Trả lời

37

Như mentioned in the documentation, đối tượng chứng thực của người dùng được lưu trữ trong user biến trong các mẫu. tài liệu đề cập bao gồm các ví dụ sau:

Khi render một mẫu RequestContext, hiện đang dùng logged-in, hoặc là một trường hợp User hay một AnonymousUser dụ, được lưu trữ trong các mẫu biến {{ user }}:

{% if user.is_authenticated %} 
    <p>Welcome, {{ user.get_username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 

EDIT: Nhờ @buffer, người đã tìm ra câu trả lời cũ này, tôi đã cập nhật nó với trạng thái gần đây nhất. Khi nó được viết ban đầu, trong chưa đầy một tháng sau khi Django 1.4 (được phát hành vào cuối tháng 3 năm 2012), nó là chính xác. Nhưng kể từ Django 1.5, phương pháp thích hợp để có được tên người dùng là để gọi get_username() trên ví dụ mô hình người dùng. Điều này đã được thêm do khả năng hoán đổi lớp User (và có trường tùy chỉnh làm tên người dùng).

+0

Tôi có thể chuyển đối tượng người dùng cho mẫu, nhưng không nên truy cập vào người dùng đã đăng nhập thông qua yêu cầu? Có vẻ như yêu cầu không thể truy cập từ mẫu, nhưng trong chế độ xem. – Emile

+0

Rất thú vị. Điều đó đúng - thay vì {{request.user.username}} (mà tôi đã sử dụng trong các dự án trước đó), {{user.username}} hoạt động. Cảm ơn bạn đã trợ giúp @tadeck! – Emile

+0

Tốt hơn nên sử dụng 'user.get_username' trên' user.username': https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_username – Medorator

5

Xem tài liệu cho RequestContextTEMPLATE_CONTEXT_PROCESSORS.

Nếu bạn muốn request ở trong ngữ cảnh mẫu, thì bạn cần phải bao gồm django.core.context_processors.request trong cài đặt TEMPLATE_CONTEXT_PROCESSORS của mình. Nó không có mặc định.

Tuy nhiên như Tadeck chỉ ra trong câu trả lời của mình user đã có sẵn nếu bạn đang sử dụng cài đặt mặc định, vì django.contrib.auth.context_processors.auth là một phần của danh sách mặc định cho TEMPLATE_CONTEXT_PROCESSORS.

+0

Cảm ơn Brian đã làm rõ. Đó là phần thông tin tôi đã mất tích. Đã xóa TEMPLATE_CONTEXT_PROCESSORS khỏi các dự án mặc định? Tôi có thể vừa quên tôi thêm vào, nhưng đã lâu rồi. – Emile

+0

@EmilePetrone Tôi không nghĩ rằng lệnh startproject hiện tại tạo ra một settings.py với 'TEMPLATE_CONTEXT_PROCESSORS'. Nó có thể có cùng một lúc, nhưng tôi không chắc chắn. –

+0

@BrianNeal: Tôi không muốn chuyển người dùng đến các mẫu .. Có cách nào để vô hiệu hóa vĩnh viễn không? – user1050619

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