Как получить текущего пользователя в методе сохранения модели django?
У меня есть следующая модель django:
class Listing(models.Model):
STATUS_CHOICES = [
('available', 'Available'),
('rented', 'Rented'),
('unavailable', 'Unavailable'),
('fake', 'Fake'),
]
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=200)
description = models.TextField()
status = models.CharField(max_length=12, choices=STATUS_CHOICES, default='available')
def save(self, *args, **kwargs):
##
if self.status == 'fake' and ......:
raise PermissionDenied("Cannot save listing with 'fake' status for non-admin users.")
super().save(*args, **kwargs)
Я думаю, как мне получить текущего аутентифицированного пользователя, чтобы увидеть, если этот пользователь является суперпользователем, то он может установить статус на подделку, другие не могут. I
Я пытаюсь посмотреть, что находится в args и kwargs. Но они пусты
Интересно, как я могу получить текущего аутентифицированного пользователя, чтобы увидеть, является ли он суперпользователем, тогда он может установить статус на поддельный, а другие не могут.
Вы не, или, по крайней мере, не в слое модели. Предполагается, что модели не зависят от запросов. Фактически, даже не говорится, что модели манипулируют базой данных на основе HTTP-запроса, команды управления, например, также могут манипулировать базой данных.
Проверка авторизации относится к слою представления. То есть в представлении или в модели администратора. Модель фокусируется на хранении, извлечении, манипулировании и т. д. данных в базе данных. Таким образом, модель, по сути, не имеет никакого отношения к тому, что могут делать пользователи и как они это делают. Модель лишь призвана обеспечить согласованное состояние базы данных.
Решать вам, как его реализовать.
class Listing(models.Model):
def save(self, is_staff=False, *args, **kwargs):
if is_staff:
# do something
...
super().save(*args, **kwargs)
def create_listing(request):
is_staff = reuqest.user.is_staff
...
listing = form.save(commit=False)
listing.save(is_staff=is_satff)
...