Làm cách nào để truy cập hồ sơ người dùng trong mẫu Django?


88

Tôi đang lưu trữ một số thông tin bổ sung cho mỗi người dùng bằng cách sử dụng AUTH_PROFILE_MODULE.

Chúng tôi có thể truy cập người dùng trong mẫu Django bằng cách sử dụng {{ request.user }}nhưng làm cách nào để chúng tôi truy cập các trường trong hồ sơ vì hồ sơ chỉ có thể truy cập thông qua một hàm user.get_profile()?

Có thực sự cần thiết phải chuyển hồ sơ vào mẫu một cách rõ ràng mọi lúc không?

Câu trả lời:


136

Sử dụng {{ request.user.get_profile.whatever }}. Ngôn ngữ tạo khuôn mẫu của Django tự động gọi những thứ có thể gọi được - trong trường hợp này là .get_profile()phương thức.



3
Tính năng này không còn được dùng trong Django 1.5 trở lên và không hoạt động trong Django 1.7 trở lên. Xem câu trả lời của Sacha Rau để biết cách thực hiện điều này trong Django hiện đại.
MichielB

27

Tôi không chắc tại sao nó lại khác, nhưng tôi cần sử dụng {{user}} hơn là {{request.user}}.


5
Các tài liệu nói rằng ( docs.djangoproject.com/en/dev/topics/auth/… ) rằng bạn có thể truy cập người dùng chỉ bằng {{user}}, như bạn nói.
Xiong Chiamiov

2
Lý do thực sự để sử dụng {{user}} chứ không phải {{request.user}} là vì bạn không bao gồm trình xử lý ngữ cảnh mẫu cho yêu cầu. https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
knightZeRo

4
Liên kết hơi khác đối với Django 1.10, nhưng ý tưởng thì giống nhau, phần django.template.context_processors.requestchèn requesttrong mẫu, trong khi phần django.contrib.auth.context_processors.authchèn usertrong ngữ cảnh. docs.djangoproject.com/en/1.10/ref/templates/api/…
Andrei-Niculae Petre

8

Có, có thể truy cập hồ sơ từ mẫu bằng request.user.get_profile

Tuy nhiên, có một lưu ý nhỏ : không phải tất cả người dùng sẽ có hồ sơ, đó là trường hợp của tôi với người dùng quản trị. Vì vậy việc gọi trực tiếp {{ request.user.get_profile.whatever }}từ mẫu sẽ gây ra lỗi trong những trường hợp như vậy.

Nếu bạn chắc chắn rằng tất cả người dùng của bạn luôn có hồ sơ, bạn có thể gọi từ mẫu một cách an toàn, nếu không hãy gọi get_profile()từ trong khối try-exception trong chế độ xem của bạn và chuyển nó vào mẫu.


Câu trả lời này gây hiểu lầm - Tôi chưa thử nghiệm {{ request.user.get_profile.whatever }}, nhưng {{ request.user.get_profile }}sẽ hoạt động và có thể được sử dụng để kiểm tra xem cấu hình có tồn tại hay không trong các phiên bản hiện tại. Xem docs.djangoproject.com/en/dev/ref/templates/api/… . Tuy nhiên, có một lưu ý sẽ thay đổi trong phiên bản phát triển, hãy xem đoạn phía trên đoạn mà tôi đã liên kết.
ralokt

@tkolar, chính xác thì điều gì gây hiểu lầm ở đây? nếu người dùng không có hồ sơ và bạn đang gọi get_profile.something sẽ gây ra lỗi.
Sergey Golovchenko

4

Nếu bạn đang sử dụng Django> 1.5, bạn không thể sử dụng được nữa get_profile.

Nếu bạn có một ứng dụng cũ, bạn nên xóa AUTH_PROFILE_MODULE = 'myapp.profile'khỏi ứng dụng của mình settings.py.

Nếu bạn sử dụng models.OneToOneField(User)trong lớp Hồ sơ của mình, bạn chỉ cần sử dụng

{{ request.user.profile.whatever }}

trong mẫu Django của bạn


1
@AlexStewart, ý bạn là chúng ta không cần requestbàn phím ở phía trước nữa?
Luk Aron

3

Nếu nó giúp ích cho bất kỳ ai, tôi đã sử dụng những thứ sau trong mẫu của mình:

Tên tài khoản: {{ user.username }}

Tên đầy đủ của người dùng: {{ user.get_full_name }}

Nhóm người dùng: {{ user.groups.all.0 }}

E-mail: {{ user.email }}

Phiên bắt đầu lúc: {{ user.last_login }}

Một kết quả mẫu như thế này:

Người dùng: auditor ezio

Nhóm người dùng: AuditGroup

Tên người dùng: testUser03

Email: testuser03@auditor.com

Phiên bắt đầu lúc - ngày 16 tháng 4 năm 2018, 9:38 tối

Cảm ơn :)


1

Đang làm việc !

Trong mô hình hồ sơ của bạn, hãy cung cấp tên_các_mục

user = models.OneToOneField(AUTH_USER_MODEL, related_name="user_profile", on_delete=models.CASCADE)

Sau đó, sử dụng mẫu. Đây là trường company_name trong bảng hồ sơ

{{ request.user.user_profile.company_name }}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.