2009-09-25 10 views

Odpowiedz

98

Gdzie trzeba poznać użytkownika?

W views użytkownik jest podany w żądaniu jako request.user.

dla użytkownika obsługi w szablonów zobaczyć here

Jeśli chcesz zapisać twórcę lub redaktorem przykład modelu można zrobić coś takiego:

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

Znalazłem to w Internecie, ale nie wiem, gdzie już

+4

Tylko uwaga, w save_formset -> set_user, powinno być, jeśli nie hasattr (instancja, 'created_by') – FurtiveFelon

+0

czy mogę uzyskać bieżącego użytkownika w settings.py? – Mahendra

+0

Dlaczego to zrobiłeś? (proszę utworzyć nowe pytanie, moje dni django już dawno minęły) – vikingosegundo

5

Rozszerzanie odpowiedź @ vikingosegundo jest, jeśli chcesz uzyskać nazwę użytkownika wewnątrz Models, znalazłem sposób, że obejmuje uznającej Middleware. Utwórz plik o nazwie get_username.py wewnątrz aplikacji, z tej treści:

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 

zmieniać swoich settings.py i dodać go do MIDDLEWARE_CLASSES:

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

Teraz, w swojej metodzie save() można uzyskać bieżącej nazwy użytkownika tak:

from get_username import get_username 

... 

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

Dedykowany wątek: http://stackoverflow.com/questions/10991460/django-get-current-user-in-model-save –

+0

@nKn jest naprawdę dedykowane MiddleWare konieczne do wywołania 'get_username()' w obiekcie 'Models'? Jeśli tak, to byłoby miło mieć link do kanonicznych dokumentów na ten temat. Czy są zaktualizowane natywne funkcje django w 1.9.5, aby zrobić to samo? – alvas

3

Django 1.9.6 domyślny projekt ma user w szablonach domyślnych

Więc można pisać takie rzeczy bezpośrednio:

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

Ta funkcjonalność jest zapewniana przez procesor django.contrib.auth.context_processors.auth kontekstowego w settings.py.

dedykowany szablon pytanie: How to access the user profile in a Django template?

Powiązane problemy