Django - Ошибка типа: save () получил неожиданный аргумент ключевого слова 'force_insert' - PullRequest
1 голос
/ 29 сентября 2019

решено

Я получаю эту ошибку при попытке зарегистрировать нового пользователя.

Traceback:

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)

account 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 голосов
/ 29 сентября 2019

Метод 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<b>, *args, **kwargs</b>):
        super(UserProfile,self).save(<b>*args, **kwargs</b>)
        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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...