mark233
mark233

Reputation: 21

TypeError: __init__() got multiple values for argument 'instance'

I was tring to keep ckeditor and markdown at same time in a edit/(add new post) in blog web backend, so i modifid __init__,after that,i can still open edit page .but,once I click save button, this error came out:TypeError: __init__() got multiple values for argument 'instance'

Traceback (most recent call last):
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\contrib\admin\options.py", line 604, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\contrib\admin\sites.py", line 223, in inner
    return view(request, *args, **kwargs)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\contrib\admin\options.py", line 1640, in change_view
    return self.changeform_view(request, object_id, form_url, extra_context)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\utils\decorators.py", line 45, in _wrapper
    return bound_method(*args, **kwargs)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\contrib\admin\options.py", line 1525, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "E:\python_works\project\django\typeidea-env\lib\site-packages\django\contrib\admin\options.py", line 1556, in _changeform_view
    form = ModelForm(request.POST, request.FILES, instance=obj)
TypeError: __init__() got multiple values for argument 'instance'

this is the part where once i delete, error won't come out:

blog/adminforms.py

class PostAdmin(forms.ModelForm):
    ....
    def __init__(self, instance=None, initial=None, **kwargs):
        initial = initial or {}
        if instance:
            if instance.is_md:
                initial['content_md'] = instance.content
            else:
                initial['content_ck'] = instance.content
        super().__init__(instance=instance, initial=initial, **kwargs)
    ....

Upvotes: 1

Views: 6068

Answers (1)

mark233
mark233

Reputation: 21

I fonud solution here: Django: multiple values for keyword argument 'initial' It is a same problem as mine,generally speaking.somehow, the instance pass todef __init__(self, instance=None, initial=None, **kwargs): is not receive by instance,instead it passed to kwargs(still don't know why),then intance is default to beNone,so there are two inastance parameters,the first instance which is default to be None,the second instanceis in kwargs which is the real one i want to pass

so that what i done to fix it:

def __init__(self, *args, **kwargs):

        initial = kwargs.get('initial') or {}
        instance = kwargs.get('instance')
        if instance:
            if instance.is_md:
                initial['content_md'] = instance.content
            else:
                initial['content_ck'] = instance.content
        kwargs.update({'instance':instance,'initial':initial})
        super().__init__(*args,**kwargs)

Upvotes: 1

Related Questions