Как добавить email вошедшего пользователя в поле в модели напрямую без использования представления в django

В моей модели есть поле, как показано ниже

uploaded_by = models.CharField(max_length=255, blank=True, null=True, editable=False)

В этом поле будет храниться имя пользователя (в данном случае - электронная почта) пользователя, загрузившего данные. Как вы видите, это поле не редактируется, поэтому пользователь никак не сможет его изменить. Данные должны быть введены с канала администратора. Я хотел узнать, есть ли способ заполнить это поле именем пользователя, вошедшего в систему и загружающего данные. Я знаю, что если я использую представление, я могу сделать что-то вроде

uploaded_by = request.user

Есть ли способ сделать то же самое непосредственно в модели, чтобы я мог использовать канал администратора напрямую для хранения имени пользователя без использования представления.

Зачем создавать заново, если кто-то уже сделал библиотеку 😀

Вы можете использовать django-currentuser. Вам просто нужно сделать это в вашем models.py

from django_currentuser.middleware import (
    get_current_user, get_current_authenticated_user)

# As model field:
from django_currentuser.db.models import CurrentUserField
class Foo(models.Model):
    created_by = CurrentUserField()
    updated_by = CurrentUserField(on_update=True)

Также не забудьте добавить промежуточное программное обеспечение в settings.py

MIDDLEWARE = (
    ...,
    'django_currentuser.middleware.ThreadLocalUserMiddleware',
)

Хотя это не совсем сохраняет email пользователя, это сохраняет ссылку пользователя, что еще лучше, вы получите все данные пользователя, сделав created_by.email etc

Метод сохранения может сделать следующее

def save(self, *args, **kwargs):
    self.uploaded_by = self.your_user
    return super( your_model , self).save(*args, **kwargs)
Вернуться на верх