Как получить текущего пользователя в методе сохранения модели 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) 
  ...
Вернуться на верх