web-dev-qa-db-fra.com

Dans Django, comment puis-je connaître l'utilisateur actuellement connecté?

Dans Django, comment puis-je connaître l'utilisateur actuellement connecté?

76
JasonYun

Où avez-vous besoin de connaître l'utilisateur?

Dans vues l'utilisateur est fourni dans la demande comme request.user.

Pour la gestion des utilisateurs dans les modèles voir ici

Si vous souhaitez enregistrer le créateur ou l'éditeur d'une instance de modèle , vous pouvez faire quelque chose comme:

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

J'ai trouvé ça sur Internet, mais je ne sais plus où

107
vikingosegundo

En étendant la réponse de @ vikingosegundo, si vous voulez obtenir le nom d'utilisateur dans Models, j'ai trouvé un moyen qui implique de déclarer un MiddleWare. Créez un fichier appelé get_username.py Dans votre application, avec ce contenu:

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

Modifiez votre settings.py Et ajoutez-le au MIDDLEWARE_CLASSES:

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

Maintenant, dans votre méthode save(), vous pouvez obtenir le nom d'utilisateur actuel comme ceci:

from get_username import get_username

...

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

Le projet par défaut de Django 1.9.6 a user dans les modèles par défaut

Vous pouvez donc écrire des choses comme ça directement:

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

Cette fonctionnalité est fournie par leDjango.contrib.auth.context_processors.auth processeur de contexte dans settings.py.

Question sur le modèle dédié: Comment accéder au profil utilisateur dans un modèle Django modèle?