2008-09-03 41 views
27

Tôi đang làm việc trên trang web mạng nội bộ nhỏ cho một công ty nhỏ, nơi người dùng có thể đăng. Tôi đã tưởng tượng một cơ chế xác thực rất đơn giản nơi mọi người chỉ cần nhập địa chỉ email của họ và được gửi một url đăng nhập duy nhất, đặt cookie sẽ luôn xác định chúng cho các yêu cầu trong tương lai.Luôn bao gồm người dùng trong ngữ cảnh mẫu django

Trong thiết lập mẫu của tôi, tôi có base.html và các trang khác mở rộng này. Tôi muốn hiển thị nút đăng nhập hoặc đăng ký trong base.html, nhưng làm thế nào tôi có thể đảm bảo rằng các biến cần thiết luôn là một phần của bối cảnh? Dường như mỗi chế độ xem chỉ thiết lập ngữ cảnh theo ý thích và không có dân số ngữ cảnh chung. Có cách nào để làm điều này mà không bao gồm người dùng trong từng bối cảnh sáng tạo không?

Hoặc tôi có phải tự tạo phím tắt tùy chỉnh để thiết lập ngữ cảnh đúng không?

Trả lời

18

Trong ý nghĩa chung hơn là không phải đặt rõ ràng các biến trong mỗi lượt xem, có vẻ như bạn muốn xem bài viết của riêng mình context processor.

Từ các tài liệu:

Một bộ xử lý bối cảnh có một giao diện rất đơn giản: Nó chỉ là một chức năng Python có một đối số, một đối tượng HttpRequest, và trả về một cuốn từ điển đó được bổ sung vào mẫu ngữ cảnh. Mỗi bộ xử lý ngữ cảnh phải trả về một từ điển.

2

Nếu bạn có thể móc xác thực của mình vào Django authentication scheme, bạn sẽ có thể sử dụng request.user.

Tôi nghĩ đây chỉ là trường hợp gọi authenticate()login() dựa trên nội dung của Cookie của bạn.

Chỉnh sửa: @Staale - Tôi luôn sử dụng locals() trick cho ngữ cảnh của mình để tất cả các mẫu của tôi có thể thấy request và do đó request.user. Nếu bạn không thì tôi đoán nó sẽ không đơn giản như vậy.

2

@ Dave Để sử dụng {{}} user.username trong các mẫu của tôi, tôi sẽ sau đó phải sử dụng requestcontext chứ không phải chỉ là một bản đồ bình thường/băm: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

Vì vậy, tôi đoán không có globals mà template engine kiểm tra.

Nhưng RequestContext có một số lớp prepopulate mà tôi có thể xem xét để giải quyết vấn đề của tôi. Cảm ơn.

32

@Ryan: Tài liệu về preprocessors là một chút nhỏ

@Staale: Thêm người sử dụng bối cảnh mỗi khi ai gọi mẫu trong quan điểm, DRY

Giải pháp là sử dụng một tiền xử lý

Một: Trong cài đặt của bạn thêm

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user', 
) 

B: Trong myapp/processor_file_name.py insert

def user(request): 
    if hasattr(request, 'user'): 
     return {'user':request.user } 
    return {} 

Từ bây giờ bạn có thể sử dụng chức năng đối tượng người dùng trong mẫu của mình.

{{ user.get_full_name }} 
+0

Django đưa ra lỗi 'Đặt' django.contrib.auth.context_processors.auth 'trong cài đặt TEMPLATE_CONTEXT_PROCESSORS của bạn để sử dụng ứng dụng quản trị.' Và ngay cả khi tôi làm điều đó, các mẫu vẫn không biết 'user'. – hobbes3

+4

@ hobbes3 vì bạn không sử dụng RequestContext, bộ xử lý ngữ cảnh không được thực hiện. –

+0

@rebus Trên thực tế trong 'views.py', tôi chuyển một từ điển đơn giản bằng cách sử dụng' render_to_resposne' như trái ngược với 'RequestContext'. Cảm ơn đã giúp đỡ. – hobbes3

43

không cần để viết một bộ xử lý bối cảnh cho đối tượng người dùng nếu bạn đã có "django.core.context_processors.auth" trong TEMPLATE_CONTEXT_PROCESSORS nếu bạn đang sử dụng RequestContext trong quan điểm của bạn.

nếu bạn đang sử dụng django 1.4 hoặc mới nhất của mô-đun đã được chuyển đến django.contrib.auth.context_processors.auth

+3

Biến ngữ cảnh mẫu này không khả dụng nếu một RequestContext không được sử dụng. – zalun

+0

Đúng, bạn phải sử dụng [RequestContext] (https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext) –

+4

Sử dụng render() (https: // docs. djangoproject.com/en/dev/topics/http/shortcuts/#render) từ Django 1.3 luôn bao gồm RequestContext tự động. –

1

có thể của nó theo mặc định, bằng cách thực hiện các bước sau đây, đảm bảo bạn đã thêm bối cảnh 'django.contrib.auth.context_processors.auth 'trong cài đặt của bạn. Theo mặc định thêm trong settings.py, vì vậy trông nó như thế này

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request', 
'django.contrib.auth.context_processors.auth', 
'django.core.context_processors.auth',) 

Và bạn có thể truy cập vào đối tượng người dùng như thế này,

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

Để biết thêm thông tin, tham khảo ở đây http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

+2

Bạn cũng cần sử dụng RequestContext thay vì Ngữ cảnh trong trường hợp này. –

3

Các gợi ý trong mọi câu trả lời, nhưng một lần nữa, từ "scratch", đối với người mới:

dữ liệu xác thực nằm trong mẫu (gần như) theo mặc định - với một mẹo nhỏ:

trong views.py:

from django.template import RequestContext 
... 
def index(request): 
    return render_to_response('index.html', 
           {'var': 'value'}, 
           context_instance=RequestContext(request)) 

trong index.html:

... 
Hi, {{ user.username }} 
var: {{ value }} 
... 

Từ đây: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

mẫu này biến bối cảnh không có sẵn nếu một RequestContext là không bei ng được sử dụng.

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