2009-09-25 7 views

Répondre

98

Où avez-vous besoin de savoir l'utilisateur?

Dans views l'utilisateur est fourni dans la demande en tant que request.user.

Pour de traitement utilisateur dans modèles voir here

Si vous souhaitez enregistrer le créateur ou l'éditeur d'une l'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() 

Je trouve cela sur Internet, mais je ne sais pas où plus

+4

Juste une note, dans save_formset -> set_user, il devrait être sinon hasattr (instance, 'created_by') – FurtiveFelon

+0

Puis-je obtenir l'utilisateur actuel dans settings.py? – Mahendra

+0

Pourquoi le feriez-vous? (s'il vous plaît créer une nouvelle question, mes jours django sont partis depuis longtemps) – vikingosegundo

5

L'extension de la réponse de @ vikingosegundo, si vous voulez obtenir le nom d'utilisateur à l'intérieur de modèles, j'ai trouvé un moyen qui consiste à déclarer un intergiciel. 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 

Modifier votre settings.py et l'ajouter à la MIDDLEWARE_CLASSES:

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

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

from get_username import get_username 

... 

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

Fil dédié: http://stackoverflow.com/questions/10991460/django-get-current-user-in-model-save –

+0

@nKn est vraiment dédié MiddleWare nécessaire pour appeler 'get_username()' dans l'objet 'Models'? Si c'est le cas, il serait bon d'avoir un lien vers un document canonique à ce sujet. Y a-t-il des fonctions django natives mises à jour en 1.9.5 pour faire la même chose? – alvas

3

projet par défaut 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 le processeur de contexte django.contrib.auth.context_processors.auth dans settings.py.

dédié question du modèle: How to access the user profile in a Django template?

Questions connexes