TypeError: save() получил неожиданный аргумент ключевого слова 'force_insert'
Я пытаюсь реализовать сигнал, который создает Profile
при сохранении экземпляра User
.
Попытка протестировать это с моей формой для регистрации пользователей дает мне следующий стектрейс:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/auth/register/
Django Version: 3.2.4
Python Version: 3.8.10
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_extensions',
'webpack_loader',
'home',
'personal_list',
'utils',
'authentication']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "/home/noxlock/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/noxlock/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/noxlock/my-anime-openings-list/MAOL/authentication/views.py", line 12, in register
form.save()
File "/home/noxlock/.local/lib/python3.8/site-packages/django/contrib/auth/forms.py", line 131, in save
user.save()
File "/home/noxlock/.local/lib/python3.8/site-packages/django/contrib/auth/base_user.py", line 67, in save
super().save(*args, **kwargs)
File "/home/noxlock/.local/lib/python3.8/site-packages/django/db/models/base.py", line 726, in save
self.save_base(using=using, force_insert=force_insert,
File "/home/noxlock/.local/lib/python3.8/site-packages/django/db/models/base.py", line 774, in save_base
post_save.send(
File "/home/noxlock/.local/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 180, in send
return [
File "/home/noxlock/.local/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 181, in <listcomp>
(receiver, receiver(signal=self, sender=sender, **named))
File "/home/noxlock/my-anime-openings-list/MAOL/personal_list/models.py", line 45, in create_profile
Profile.objects.create(user=instance)
File "/home/noxlock/.local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/noxlock/.local/lib/python3.8/site-packages/django/db/models/query.py", line 453, in create
obj.save(force_insert=True, using=self.db)
Exception Type: TypeError at /auth/register/
Exception Value: save() got an unexpected keyword argument 'force_insert'
Обычно это происходит из-за отсутствия **kwargs в определении метода save
, но на самом деле у меня нет такого метода для моей модели Profile, и я использую стандартную модель Django User, для которой это единственное расширение, которое я написал.
Ниже приведена моя модель профиля и код сигнала.
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from imagekit.models import ProcessedImageField
from imagekit.processors import ResizeToFill
from home.models import ModelAbstract
# P.S ModelAbstract doesn't have a save method either, just adds some nifty date fields.
class Profile(ModelAbstract):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = ProcessedImageField(
upload_to='avatars', default='avatars/placeholder.png',
processors=[ResizeToFill(256, 256)],
format="PNG"
)
banner = ProcessedImageField(
upload_to='banners', default='banners/placeholder.png',
processors=[ResizeToFill(256, 256)],
format="PNG"
)
def get_recent_ratings(self):
pass
def get_top_ratings(self):
pass
# On User creation, make a profile as well
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
Знаете что, у меня действительно была проблема с отсутствием *args и **kwargs в моем методе сохранения. Только в родительской модели, от которой наследовался Profile.
Вот как выглядел код:
class DateData(models.Model):
date_created = models.DateTimeField()
last_modified = models.DateTimeField()
class Meta:
abstract = True
def save(self):
# Only set this field on the first save
if not self.date_created:
date_created = timezone.now()
last_modified = timezone.now()
class ModelAbstract(DateData):
class Meta:
abstract = True
Просто нужно было изменить это на def save(self, *args, **kwargs):