Uwaga, w save_formset -> set_user powinno być, jeśli nie hasattr (instancja, 'created_by')
FurtiveFelon
mogę pobrać aktualnego użytkownika w settings.py?
Mahendra Garg
Dlaczego chcesz to zrobić? (należy utworzyć nowe pytanie, moje dni django dawno już minęły)
vikingosegundo
@vikingosegundo Zastanawiałem się tylko, dlaczego nie używasz już Django? Czy nie zajmujesz się już programowaniem back-end, czy też przeniosłeś się na NodeJS?
Alfa Bravo
1
z jakiegoś powodu nie zadziałało to przy użyciu funkcji wewnętrznej, set_usera następnie jej odwzorowaniu instances. Po prostu nie zapisywał nowych modeli w bazie danych. Musiałem użyć for instance in instances: z set_userciałem wewnątrz pętli i działało idealnie. Dodatkowo myślę, że if formset.model == Articlepowinno if formset.model == Image. Dzięki @vikingosegundo za odpowiedź. Przez wiele dni uderzałem głową w klawiaturę, próbując rozwiązać ten problem!
ekauffmann
6
Rozszerzając odpowiedź @ vikingosegundo, jeśli chcesz uzyskać nazwę użytkownika w modelach, znalazłem sposób, który obejmuje zadeklarowanie oprogramowania MiddleWare. Utwórz plik o nazwie get_username.pywewnątrz aplikacji, zawierający następującą zawartość:
from threading import current_thread
_requests = {}
defget_username():
t = current_thread()
if t notin _requests:
returnNonereturn _requests[t]
classRequestMiddleware(object):defprocess_request(self, request):
_requests[current_thread()] = request
Edytuj swój settings.pyi dodaj go do MIDDLEWARE_CLASSES:
@nKn czy naprawdę dedykowane oprogramowanie MiddleWare jest niezbędne do wywołania get_username()w Modelsobiekcie? Jeśli tak, byłoby miło mieć link do kanonicznych dokumentów dotyczących tego. Czy są zaktualizowane natywne funkcje django w 1.9.5, które robią to samo?
alvas
5
Domyślny projekt Django 1.9.6 ma userw domyślnych szablonach
Możesz więc bezpośrednio pisać takie rzeczy:
{% if user.is_authenticated %}
{{ user.username }}
{% else %}
Not logged in.
{% endif %}
Ta funkcja jest udostępniana przez django.contrib.auth.context_processors.authprocesor kontekstu w settings.py.
Odpowiedzi:
Gdzie musisz znać użytkownika?
W widokach użytkownik jest podany w żądaniu jako
request.user
.Na łatwość obsługi w szablonach zobaczyć tutaj
Jeśli chcesz zapisać twórcę lub edytora instancji modelu , możesz 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 już nie wiem gdzie
źródło
set_user
a następnie jej odwzorowaniuinstances
. Po prostu nie zapisywał nowych modeli w bazie danych. Musiałem użyćfor instance in instances:
zset_user
ciałem wewnątrz pętli i działało idealnie. Dodatkowo myślę, żeif formset.model == Article
powinnoif formset.model == Image
. Dzięki @vikingosegundo za odpowiedź. Przez wiele dni uderzałem głową w klawiaturę, próbując rozwiązać ten problem!Rozszerzając odpowiedź @ vikingosegundo, jeśli chcesz uzyskać nazwę użytkownika w modelach, znalazłem sposób, który obejmuje zadeklarowanie oprogramowania MiddleWare. Utwórz plik o nazwie
get_username.py
wewnątrz aplikacji, zawierający następującą zawartość: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
Edytuj swój
settings.py
i dodaj go doMIDDLEWARE_CLASSES
:Teraz w swojej
save()
metodzie możesz pobrać aktualną nazwę użytkownika w następujący sposób:from get_username import get_username ... def save(self, *args, **kwargs): req = get_username() print "Your username is: %s" % (req.user)
źródło
get_username()
wModels
obiekcie? Jeśli tak, byłoby miło mieć link do kanonicznych dokumentów dotyczących tego. Czy są zaktualizowane natywne funkcje django w 1.9.5, które robią to samo?Domyślny projekt Django 1.9.6 ma
user
w domyślnych szablonachMożesz więc bezpośrednio pisać takie rzeczy:
{% if user.is_authenticated %} {{ user.username }} {% else %} Not logged in. {% endif %}
Ta funkcja jest udostępniana przez
django.contrib.auth.context_processors.auth
procesor kontekstu wsettings.py
.Pytanie dotyczące szablonu dedykowanego: Jak uzyskać dostęp do profilu użytkownika w szablonie Django?
źródło