À Django, Comment connaître l'utilisateur actuellement connecté?

à Django, Comment connaître l'utilisateur actuellement connecté?

73
demandé sur Filipe Correia 2009-09-25 17:35:45

3 réponses

où devez-vous connaître l'utilisateur?

Dans points de vue , l'utilisateur est fourni dans la demande comme étant request.user .

Pour l'utilisateur de manutention dans modèles voir ici

si vous voulez sauver le créateur ou l'éditeur d'une instance du 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ù

102
répondu vikingosegundo 2009-09-25 13:55:51

extension de la réponse de @vikingosegundo, si vous voulez obtenir le nom d'utilisateur à L'intérieur des modèles, j'ai trouvé une façon qui implique la déclaration d'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

éditez 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 courant comme ceci:

from get_username import get_username

...

def save(self, *args, **kwargs):
    req = get_username()
    print "Your username is: %s" % (req.user)
5
répondu nKn 2016-03-31 09:53:30

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

donc vous pouvez écrire des choses comme ceci directement:

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

cette fonctionnalité est fournie par le processeur de contexte django.contrib.auth.context_processors.auth dans settings.py .

Question sur le modèle dédié: comment accéder au profil de L'utilisateur dans un modèle Django?

3