Django-类型错误:save()得到了意外的关键字参数'force_insert'

时间:2019-09-29 16:49:33

标签: django

已解决

尝试注册新用户时出现此错误。

跟踪:

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py" in dispatch
  88.         return handler(request, *args, **kwargs)

File "/usr/local/lib/python2.7/dist-packages/django/views/generic/edit.py" in post
  183.             return self.form_valid(form)

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'

我添加了一个供用户上传个人资料图片的表格,该表格可以正常工作,但现在我收到此错误


accounts / models.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)

帐户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)

类型错误:save()得到了意外的关键字参数'force_insert 类型错误:save()得到了意外的关键字参数'force_insert


谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

Model的{​​{3}}采用了一些额外的可选参数。确实,签名是:

  

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

     

如果您要自定义保存行为,则可以覆盖此save()   方法。参见save(..) method [Django-doc]   有关更多详细信息。

因此,如果您覆盖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)