Trong Django, làm cách nào để biết người dùng hiện đang đăng nhập?
Câu trả lời:
Bạn cần biết người dùng ở đâu?
Trong các lượt xem , người dùng được cung cấp trong yêu cầu dưới dạng request.user
.
Để xử lý người dùng trong các mẫu, hãy xem tại đây
Nếu bạn muốn lưu người tạo hoặc người chỉnh sửa phiên bản của một mô hình, bạn có thể làm như sau:
model.py
class Article(models.Model):
created_by = models.ForeignKey(User, related_name='created_by')
created_on = models.DateTimeField(auto_now_add = True)
edited_by = models.ForeignKey(User, related_name='edited_by')
edited_on = models.DateTimeField(auto_now = True)
published = models.BooleanField(default=None)
admin.py
class ArticleAdmin(admin.ModelAdmin):
fields= ('title','slug','text','category','published')
inlines = [ImagesInline]
def save_model(self, request, obj, form, change):
instance = form.save(commit=False)
if not hasattr(instance,'created_by'):
instance.created_by = request.user
instance.edited_by = request.user
instance.save()
form.save_m2m()
return instance
def save_formset(self, request, form, formset, change):
def set_user(instance):
if not instance.created_by:
instance.created_by = request.user
instance.edited_by = request.user
instance.save()
if formset.model == Article:
instances = formset.save(commit=False)
map(set_user, instances)
formset.save_m2m()
return instances
else:
return formset.save()
Tôi đã tìm thấy cái này trên Internet, nhưng tôi không biết ở đâu nữa
set_user
và sau đó ánh xạ nó qua instances
. Nó chỉ không lưu các mô hình mới vào cơ sở dữ liệu. Tôi đã phải sử dụng a for instance in instances:
với phần set_user
thân bên trong vòng lặp và hoạt động hoàn hảo. Ngoài ra, tôi nghĩ rằng điều if formset.model == Article
nên làm if formset.model == Image
. Cảm ơn @vikingosegundo vì câu trả lời của bạn. Tôi đã đập đầu vào bàn phím trong nhiều ngày để cố gắng giải quyết vấn đề này !!
Mở rộng câu trả lời của @ vikingosegundo, nếu bạn muốn lấy tên người dùng bên trong Mô hình, tôi đã tìm thấy một cách liên quan đến việc khai báo MiddleWare. Tạo một tệp có tên get_username.py
bên trong ứng dụng của bạn, với nội dung sau:
from threading import current_thread
_requests = {}
def get_username():
t = current_thread()
if t not in _requests:
return None
return _requests[t]
class RequestMiddleware(object):
def process_request(self, request):
_requests[current_thread()] = request
Chỉnh sửa của bạn settings.py
và thêm nó vào MIDDLEWARE_CLASSES
:
MIDDLEWARE_CLASSES = (
...
'yourapp.get_username.RequestMiddleware',
)
Bây giờ, trong save()
phương thức của bạn , bạn có thể lấy tên người dùng hiện tại như sau:
from get_username import get_username
...
def save(self, *args, **kwargs):
req = get_username()
print "Your username is: %s" % (req.user)
get_username()
trong Models
đối tượng không? Nếu vậy, thật tuyệt nếu có một liên kết đến một tài liệu chuẩn về điều đó. Có các hàm django gốc được cập nhật trong 1.9.5 để làm điều tương tự không?
Dự án mặc định Django 1.9.6 có user
trong các mẫu mặc định
Vì vậy, bạn có thể viết những thứ như thế này trực tiếp:
{% if user.is_authenticated %}
{{ user.username }}
{% else %}
Not logged in.
{% endif %}
Chức năng này được cung cấp bởi django.contrib.auth.context_processors.auth
bộ xử lý ngữ cảnh trong settings.py
.
Câu hỏi về mẫu dành riêng: Làm cách nào để truy cập hồ sơ người dùng trong mẫu Django?