Невозможно вызвать .delete() для экземпляра учетной записи пользователя в Django
Я пытаюсь настроить простое представление для удаления учетных записей пользователей. Однако по какой-то причине оно возвращает
Поле 'id' ожидало число, но получило 'deleted_user'.
и не удаляет экземпляр.
# View
def delete_account(request, username):
"""
Deletes the user account
"""
user = Account.objects.get(username=username).delete()
return redirect('pollboard')
# Model
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name='email', max_length=60, unique=True)
username = models.CharField(max_length=40, unique=True)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
email_confirmed = models.BooleanField(default=False)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
profile_image = models.ImageField(max_length=255, upload_to=get_profile_image_filepath, null=True, blank=True, default=get_default_profile_image())
hide_email = models.BooleanField(default=True)
class Poller(models.Model):
"""
Main Model to describe Poller objects
"""
created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(Account, on_delete=models.SET('deleted_user'))
# Template
<div class="delete-modal-buttons">
<a href="{% url 'delete-account' username=user.username %}"><button class="delete-button" id="delete-account">Delete Account</button></a>
<button class="delete-button" id="cancel-delete">Cancel</button>
</div>
Вы указали on_delete=models.SET('deleted_user')
для внешнего ключа, указывающего на ваш Account
. Это буквально пытается установить значение поля в строку 'deleted_user'
. Проблема в том, что внешний ключ - это (в основном) первичный ключ связанной строки другой таблицы, который по умолчанию является целым числом. Поэтому установка его в строку не имеет смысла. Вместо этого вы можете передать функцию models.SET
, которая получит или создаст пользователя-заполнителя, как описано в документации :
def get_deleted_user():
return Account.objects.get_or_create(username='deleted_user')[0]
class Poller(models.Model):
"""
Main Model to describe Poller objects
"""
created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(Account, on_delete=models.SET(get_deleted_user))