类型错误:save() 收到意外的关键字参数“force_insert”

5 django django-models django-views

当我尝试注册新用户时出现此错误:

...
File "/home/django/django_project/accounts/views.py" in form_valid
  34.         new_user = User.objects.create(username=username, email=email)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in manager_method
  85.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in create
  394.         obj.save(force_insert=True, using=self.db)

File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/base_user.py" in save
  80.         super(AbstractBaseUser, self).save(*args, **kwargs)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" in save
  808.                        force_update=force_update, update_fields=update_fields)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" in save_base
  848.                 update_fields=update_fields, raw=raw, using=using,

File "/usr/local/lib/python2.7/dist-packages/django/dispatch/dispatcher.py" in send
  193.             for receiver in self._live_receivers(sender)

File "/home/django/django_project/accounts/models.py" in post_save_user_receiver
  150.         new_profile = UserProfile.objects.get_or_create(user=instance)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in manager_method
  85.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in get_or_create
  466.             return self._create_object_from_params(lookup, params)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in _create_object_from_params
  500.                 obj = self.create(**params)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in create
  394.         obj.save(force_insert=True, using=self.db)

Exception Type: TypeError at /register/
Exception Value: save() got an unexpected keyword argument 'force_insert'
Run Code Online (Sandbox Code Playgroud)

以下是参与此错误的模型和视图:

帐户/模型.py

class UserProfile(models.Model):
    ....

def save(self):
    super(UserProfile,self).save()
    img = Image.open(self.image.path)

    if img.height > 300 or img.width > 300:
        output_size = (300, 300)
        img.thumbnail(output_size)
        img.save(self.image.path)



def post_save_user_receiver(sender, instance, created, *args, **kwargs):
    if created:
        new_profile = UserProfile.objects.get_or_create(user=instance)

    if UserProfile.stripe_customer_id is None or UserProfile.stripe_customer_id == '':
        new_customer_id = stripe.Customer.create(email=instance.email)
        free_membership = Membership.objects.get(membership_type='Free')
        UserProfile.stripe_customer_id = new_customer_id['id']
        UserProfile.membership = free_membership
        UserProfile.save()


post_save.connect(post_save_user_receiver, sender=settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)

账户/views.py

class UserRegisterView(FormView):
    template_name = 'accounts/user_register_form.html'
    form_class = UserRegisterForm
    success_url = '/login'

    def form_valid(self, form):
        username = form.cleaned_data.get("username")
        email = form.cleaned_data.get("email")
        password = form.cleaned_data.get("password")
        new_user = User.objects.create(username=username, email=email)
        new_user.set_password(password)
        new_user.save()
        messages.info(self.request, 'Welcome')
        return super(UserRegisterView, self).form_valid(form)


def profile_view(request):
    if request.method == 'POST':
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
        if p_form.is_valid():
            p_form.save()
            messages.info(request, 'Saved')
            return redirect('/')
    else:
        p_form = ProfileUpdateForm() #instance=request.user.profile

    context = {
        'p_form' : p_form,
    }
    return render(request,'accounts/userprofile.html',context)
Run Code Online (Sandbox Code Playgroud)

有任何迹象表明正在发生什么吗?

Wil*_*sem 6

a 的方法save(..)[Django-doc]Model需要一些额外的可选参数。事实上签名是:

Model.save(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None)

如果您想要自定义保存行为,您可以覆盖此save() 方法。 有关更多详细信息,请参阅覆盖预定义模型方法。

因此,如果您重写该save(..)函数,最好尊重签名。您不必自己指定这些参数,但可以使用*args**kwargs将位置参数和命名参数传递给底层save方法:

class UserProfile(models.Model):

    # ...

    def save(self, *args, **kwargs):
        super(UserProfile,self).save(*args, **kwargs)
        if self.image:
            img = Image.open(self.image.path)
            if img.height > 300 or img.width > 300:
                output_size = (300, 300)
                img.thumbnail(output_size)
                img.save(self.image.path)
Run Code Online (Sandbox Code Playgroud)