Nur eine Anmerkung, in save_formset -> set_user sollte es sein, wenn nicht hasattr (Instanz 'created_by')
FurtiveFelon
Kann ich den aktuellen Benutzer in settings.py abrufen?
Mahendra Garg
Warum würdest du das tun? (Bitte erstellen Sie eine neue Frage, meine Django-Tage sind lange vorbei)
vikingosegundo
@vikingosegundo Ich habe mich nur gefragt, warum Sie Django nicht mehr verwenden. Führen Sie keine Back-End-Entwicklung mehr durch oder sind Sie zu NodeJS gewechselt?
Alfa Bravo
1
Aus irgendeinem Grund hat es bei mir nicht funktioniert, die innere Funktion zu verwenden set_userund sie dann abzubilden instances. Es wurden einfach keine neuen Modelle in der Datenbank gespeichert. Ich musste ein for instance in instances: mit dem set_userKörper in der Schleife verwenden und arbeitete perfekt. Darüber hinaus denke ich, dass das if formset.model == Articlesein sollte if formset.model == Image. Vielen Dank an @vikingosegundo für Ihre Antwort. Ich habe tagelang mit dem Kopf auf die Tastatur geschlagen, um das zu lösen !!
Ekauffmann
6
Wenn Sie die Antwort von @ vikingosegundo erweitern und den Benutzernamen in Models erhalten möchten, habe ich einen Weg gefunden, bei dem eine MiddleWare deklariert wird. Erstellen Sie eine get_username.pyin Ihrer App aufgerufene Datei mit folgendem Inhalt:
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
Bearbeiten Sie Ihre settings.pyund fügen Sie es hinzu MIDDLEWARE_CLASSES:
@nKn ist die wirklich dedizierte MiddleWare notwendig, um get_username()im ModelsObjekt aufzurufen ? Wenn ja, wäre es schön, einen Link zu einem kanonischen Dokument zu haben. Gibt es aktualisierte native Django-Funktionen in 1.9.5, um dasselbe zu tun?
Alvas
5
Das Standardprojekt von Django 1.9.6 ist userin den Standardvorlagen enthalten
So können Sie solche Dinge direkt schreiben:
{% if user.is_authenticated %}
{{ user.username }}
{% else %}
Not logged in.
{% endif %}
Diese Funktionalität wird vom django.contrib.auth.context_processors.authKontextprozessor in bereitgestellt settings.py.
Antworten:
Wo müssen Sie den Benutzer kennen?
In Ansichten wird der Benutzer in der Anfrage als angegeben
request.user
.Informationen zur Benutzerhandhabung in Vorlagen finden Sie hier
Wenn Sie den Ersteller oder Editor einer Modellinstanz speichern möchten, können Sie Folgendes tun:
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()
Ich habe das im Internet gefunden, weiß aber nicht mehr wo
quelle
set_user
und sie dann abzubildeninstances
. Es wurden einfach keine neuen Modelle in der Datenbank gespeichert. Ich musste einfor instance in instances:
mit demset_user
Körper in der Schleife verwenden und arbeitete perfekt. Darüber hinaus denke ich, dass dasif formset.model == Article
sein sollteif formset.model == Image
. Vielen Dank an @vikingosegundo für Ihre Antwort. Ich habe tagelang mit dem Kopf auf die Tastatur geschlagen, um das zu lösen !!Wenn Sie die Antwort von @ vikingosegundo erweitern und den Benutzernamen in Models erhalten möchten, habe ich einen Weg gefunden, bei dem eine MiddleWare deklariert wird. Erstellen Sie eine
get_username.py
in Ihrer App aufgerufene Datei mit folgendem Inhalt: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
Bearbeiten Sie Ihre
settings.py
und fügen Sie es hinzuMIDDLEWARE_CLASSES
:Jetzt können Sie in Ihrer
save()
Methode den aktuellen Benutzernamen wie folgt abrufen:from get_username import get_username ... def save(self, *args, **kwargs): req = get_username() print "Your username is: %s" % (req.user)
quelle
get_username()
imModels
Objekt aufzurufen ? Wenn ja, wäre es schön, einen Link zu einem kanonischen Dokument zu haben. Gibt es aktualisierte native Django-Funktionen in 1.9.5, um dasselbe zu tun?Das Standardprojekt von Django 1.9.6 ist
user
in den Standardvorlagen enthaltenSo können Sie solche Dinge direkt schreiben:
{% if user.is_authenticated %} {{ user.username }} {% else %} Not logged in. {% endif %}
Diese Funktionalität wird vom
django.contrib.auth.context_processors.auth
Kontextprozessor in bereitgestelltsettings.py
.Spezielle Vorlagenfrage: Wie greife ich auf das Benutzerprofil in einer Django-Vorlage zu?
quelle