Пытался обновить поле с экземпляром модели, <SimpleLazyObject:<<>>. Используйте значение, совместимое с CharField
Я пытаюсь обойти метод save в моей модели для хранения текущего зарегистрированного пользователя. Я использую django-current пользователя для получения аутентифицированного пользователя. Я написал такой код
from django_currentuser.middleware import (
get_current_user, get_current_authenticated_user)
from django_currentuser.db.models import CurrentUserField
uploaded_by = models.CharField(max_length=255, blank=True, null=True, editable=False)
def save(self, *args, **kwargs):
user = get_current_authenticated_user()
self.uploaded_by = user
super(Citation, self).save(*args, **kwargs)
Но я получаю эту ошибку
Tried to update field professional.Citation.uploaded_by with a model instance, <SimpleLazyObject: <CustomUser: staff@gmail.com>>. Use a value compatible with CharField.
Пожалуйста, подскажите, что мне делать, так как я хочу сохранить текущего зарегистрированного пользователя в методе сохранения модели, а также сохранить это поле не редактируемым.
Я получаю эту ошибку только при обновлении поля, при первом сохранении все работает нормально
Вы получаете эту ошибку, потому что пытаетесь сохранить пользовательский объект в поле char. Ваш файл uploaded_by является полем CharField. Вы можете сохранить только строковое значение в этом поле.
попробуйте это и, надеюсь, это решит ваши проблемы:
from django.contrib.auth.models import User #import user model
# add user ForeignKey fields in your model
user = models.ForeignKey(User,on_delete=models.CASCADE)
uploaded_by = models.CharField(max_length=255, blank=True, null=True, editable=False)
def save(self, *args, **kwargs):
user = self.user.username
if not self.uploaded_by:
self.uploaded_by = user
super(Citation, self).save(*args, **kwargs)
Вот как я преодолел ошибку
def save(self, *args, **kwargs):
current_user = get_current_authenticated_user()
user =CustomUser.objects.get(email = current_user)
self.uploaded_by = user.email
super(Citation, self).save(*args, **kwargs)
Здесь я получаю пользователя перед непосредственным сохранением с помощью get_current_authenticated_user() и затем сохраняю имя пользователя (в моем случае email).
def save_model(self, request, obj, form, change):
if change:
obj.updated_by = str(request.user)
else:
obj.created_by = str(request.user)
return super().save_model(request, obj, form, change)
str() приведение типов работает.