2009-09-25 12 views

risposta

98

Dove è necessario conoscere l'utente?

In views l'utente viene fornito nella richiesta come request.user.

Per l'utente di gestione in modelli vedono here

Se si desidera salvare il creatore o editore di esempio un modello di si può fare qualcosa di simile:

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

ho trovato questo su internet, ma non so dove più

+4

Solo una nota, in save_formset -> set_user, dovrebbe essere se non hasattr (istanza, 'created_by') – FurtiveFelon

+0

posso ottenere l'utente corrente in settings.py? – Mahendra

+0

Perché dovresti farlo? (Si prega di creare una nuova domanda, i miei giorni sono ormai lontani Django) – vikingosegundo

5

Estendere la risposta di @ vikingosegundo, se si desidera ottenere il nome utente all'interno Models, ho trovato un modo che coinvolge dichiarando un middleware. Creare un file chiamato get_username.py all'interno della vostra applicazione, con questo contenuto:

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 

Modificare il settings.py e aggiungerlo alla MIDDLEWARE_CLASSES:

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

Ora, nel metodo save(), è possibile ottenere il nome utente corrente in questo modo:

from get_username import get_username 

... 

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

thread dedicato: http://stackoverflow.com/questions/10991460/django-get-current-user-in-model-save –

+0

@nKn è la realtà dedicata MiddleWare è necessario invocare 'get_username()' nell'oggetto 'Models'? Se è così, sarebbe bello avere un link a un documento canonico su questo. Ci sono funzioni native di django aggiornate in 1.9.5 per fare lo stesso? – alvas

3

Django 1.9.6 progetto di default ha user nei modelli predefiniti

modo da poter scrivere le cose in questo modo direttamente:

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

Questa funzionalità è fornita dal processore django.contrib.auth.context_processors.auth contesto in settings.py.

Dedicato domanda modello: How to access the user profile in a Django template?

Problemi correlati