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:


109

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


4
Chỉ cần một lưu ý, trong save_formset -> set_user, nó phải là nếu không hasattr (ví dụ, 'created_by')
FurtiveFelon

tôi có thể lấy người dùng hiện tại trong settings.py?
Mahendra Garg

Tại sao bạn lại làm vậy? (xin vui lòng tạo ra một câu hỏi mới, ngày django tôi qua lâu rồi)
vikingosegundo

@vikingosegundo Tôi chỉ tự hỏi tại sao bạn không sử dụng Django nữa? Bạn không phát triển back-end nữa hay chuyển sang NodeJS?
Alfa Bravo

1
vì một số lý do nó không hoạt động đối với tôi bằng cách sử dụng hàm bên trong set_uservà 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_userthâ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 == Articlenê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 !!
ekauffmann

6

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.pybê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.pyvà 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)


@nKn có thực sự cần thiết MiddleWare chuyên dụng để gọi 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?
alvas

5

Dự án mặc định Django 1.9.6 có usertrong 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.authbộ 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?

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.