У Django, як я можу дізнатись, хто зареєстрований користувач?
У Django, як я можу дізнатись, хто зареєстрований користувач?
Відповіді:
Де потрібно знати користувача?
У поданнях користувач в запиті надається як request.user
.
Інформацію про обробку користувачами в шаблонах див. Тут
Якщо ви хочете зберегти творця або редактора екземпляра моделі, ви можете зробити щось на зразок:
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()
Я знайшов це в Інтернеті, але вже не знаю де
set_user
а потім зіставляючи її instances
. Це просто не зберегло нові моделі в базі даних. Мені довелося використовувати a for instance in instances:
з set_user
тілом всередині петлі, і я працював чудово. Крім того, я думаю, що так if formset.model == Article
повинно бути if formset.model == Image
. Дякую @vikingosegundo за вашу відповідь. Я цілими днями ударяв головою по клавіатурі, намагаючись це вирішити !!
Розширюючи відповідь @ vikingosegundo, якщо ви хочете отримати ім’я користувача всередині Models, я знайшов спосіб, який передбачає оголошення MiddleWare. Створіть файл із назвою get_username.py
всередині програми з таким вмістом:
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
Відредагуйте settings.py
та додайте його до MIDDLEWARE_CLASSES
:
MIDDLEWARE_CLASSES = (
...
'yourapp.get_username.RequestMiddleware',
)
Тепер у вашому save()
методі ви можете отримати поточне ім’я користувача таким чином:
from get_username import get_username
...
def save(self, *args, **kwargs):
req = get_username()
print "Your username is: %s" % (req.user)
get_username()
в Models
об'єкті? Якщо так, було б непогано мати посилання на канонічні документи щодо цього. Чи існують оновлені власні функції django в 1.9.5, щоб зробити те саме?
Проект user
за замовчуванням Django 1.9.6 містить шаблони за замовчуванням
Тож ви можете писати подібні речі безпосередньо:
{% if user.is_authenticated %}
{{ user.username }}
{% else %}
Not logged in.
{% endif %}
Ця функціональність забезпечується django.contrib.auth.context_processors.auth
процесором контексту в settings.py
.
Питання про виділений шаблон: Як отримати доступ до профілю користувача в шаблоні Django?