У Django, як я можу дізнатись, хто зареєстрований користувач?


Відповіді:


110

Де потрібно знати користувача?

У поданнях користувач в запиті надається як request.user.

Інформацію про обробку користувачами в шаблонах див. Тут

Якщо ви хочете зберегти творця або редактора екземпляра моделі, ви можете зробити щось на зразок:

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()

Я знайшов це в Інтернеті, але вже не знаю де


4
Тільки примітка, у save_formset -> set_user це повинно бути, якщо не hasattr (екземпляр, 'created_by')
FurtiveFelon

чи можу я отримати поточного користувача в settings.py?
Mahendra Garg

Чому ви це робите? (будь ласка, створіть нове запитання, мої дні
джанго

@vikingosegundo Мені просто цікаво, чому ти більше не використовуєш Django? Ви більше не займаєтесь розробкою на задньому плані або перейшли до NodeJS?
Alfa Bravo

1
з якоїсь причини це не спрацювало для мене, використовуючи внутрішню функцію, set_userа потім зіставляючи її instances. Це просто не зберегло нові моделі в базі даних. Мені довелося використовувати a for instance in instances: з set_userтілом всередині петлі, і я працював чудово. Крім того, я думаю, що так if formset.model == Articleповинно бути if formset.model == Image. Дякую @vikingosegundo за вашу відповідь. Я цілими днями ударяв головою по клавіатурі, намагаючись це вирішити !!
ekauffmann

6

Розширюючи відповідь @ vikingosegundo, якщо ви хочете отримати ім’я користувача всередині Models, я знайшов спосіб, який передбачає оголошення MiddleWare. Створіть файл із назвою get_username.pyвсередині програми з таким вмістом:

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

Відредагуйте settings.pyта додайте його до MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (
    ...
    'yourapp.get_username.RequestMiddleware',
)

Тепер у вашому save()методі ви можете отримати поточне ім’я користувача таким чином:

from get_username import get_username

...

def save(self, *args, **kwargs):
    req = get_username()
    print "Your username is: %s" % (req.user)


@nKn - чи справді виділене MiddleWare потрібно викликати get_username()в Modelsоб'єкті? Якщо так, було б непогано мати посилання на канонічні документи щодо цього. Чи існують оновлені власні функції django в 1.9.5, щоб зробити те саме?
альвас

5

Проект userза замовчуванням Django 1.9.6 містить шаблони за замовчуванням

Тож ви можете писати подібні речі безпосередньо:

{% if user.is_authenticated %}
    {{ user.username }}
{% else %}
    Not logged in.
{% endif %}

Ця функціональність забезпечується django.contrib.auth.context_processors.authпроцесором контексту в settings.py.

Питання про виділений шаблон: Як отримати доступ до профілю користувача в шаблоні Django?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.