django admin/options.py TypeError: 需要 2 个选项,给定 3 个

Posted

技术标签:

【中文标题】django admin/options.py TypeError: 需要 2 个选项,给定 3 个【英文标题】:django admin/options.py TypeError: 2 options needed, 3 given 【发布时间】:2018-01-28 16:57:16 【问题描述】:

编辑:我已按要求在下面发布了完整的回溯。

我需要在删除页面模型之前发生一些自定义逻辑,所以我重载了 delete() 方法。 (我知道这是不好的形式。我后来修复了它,但重要的是要表达我是如何陷入这种混乱的)

这样的:

def delete(self, *args, **kwargs):
    # Do some stuff...
    super(Pages, self).delete()

不幸的是,当我尝试通过管理界面删除页面时,这导致了以下类型错误:delete_model() 接受 2 个位置参数,但给出了 3 个

我认为我需要做正确的事情,所以我删除了 delete 方法重载,并通过以下信号处理程序实现了 pre_delete 逻辑:

@receiver(pre_delete, sender=Pages)
def handle_page_delete(sender, **kwargs):
    obj = kwargs['instance']


    if(obj != None):
        tmp1 = obj.prev_id
        tmp2 = obj.next_id

    if(tmp1 != None):
        tmp1.next_id = tmp2
        obj.prev_id = None

    if(tmp2 != None):
        tmp2.prev_id = tmp1
        obj.next_id = None

我遵循最佳实践,将处理程序放在信号子模块中,并通过 ready() 在 apps.py 中的重载 AppConfig 中注册它。

不幸的是,我仍然遇到同样的错误:TypeError delete_model() 接受 2 个位置参数,但给出了 3 个

然后,我将重载的删除函数重新实现为存根,认为也许我只需要放入正确的选项。所以,我保留了信号逻辑,并简单地将以下内容添加回我的 Pages 模型中:

def delete(self, *args, **kwargs):
    super(Pages, self).delete(*args, **kwargs)

您会注意到,这次我搜索了文档,并放置了正确的两个 *args 和 **kwargs 参数。

但我仍然得到相同的 TypeError:delete_model() 接受 2 个位置参数,但给出了 3 个

所以最后,我注释掉了所有自定义删除逻辑,并且只使用了 vanilla django 代码库。我仍然遇到同样的错误:delete_model() 接受 2 个位置参数,但给出了 3 个

什么给了?异常位置在我的 django 安装本身内部,在 django/contrib/admin/options.py 中。我以前从未遇到过安装问题,我不认为我应该认为这是 django 本身的问题。我真的认为我在这里做错了什么,但我有点不知道从这里去哪里。

任何帮助将不胜感激。感谢您的宝贵时间。

编辑

根据要求,完整跟踪如下:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/admin/webcomics/pages/13/delete/

Django Version: 1.10.5
Python Version: 3.6.0
Installed Applications:
['webcomics.apps.WebcomicsConfig',
 'tinymce',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 '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:

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

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

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

File "/usr/local/lib/python3.6/site-packages/django/contrib/admin/options.py" in wrapper
  544.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  57.         response = view_func(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/contrib/admin/sites.py" in inner
  211.             return view(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py" in _wrapper
  67.             return bound_func(*args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py" in bound_func
  63.                 return func.__get__(self, type(self))(*args2, **kwargs2)

File "/usr/local/lib/python3.6/contextlib.py" in inner
  53.                 return func(*args, **kwds)

File "/usr/local/lib/python3.6/site-packages/django/contrib/admin/options.py" in delete_view
  1718.             self.delete_model(request, obj)

Exception Type: TypeError at /admin/webcomics/pages/13/delete/
Exception Value: delete_model() takes 2 positional arguments but 3 were given

【问题讨论】:

你使用的是什么 django 版本? 在来自 options.py 的错误之前,回溯中是否显示了任何内容?我的意思是 - 你没有在模型/(模型)管理员/类似 delete 某处或其他地方命名属性? 你能发布完整的跟踪吗? 该错误似乎不是来自此代码。 @Escher,完成。 @schwobaseggl,我使用的是 django 版本 1.10.5。 @Jon Clements,我可能总是错过它,但我确实多次通过代码寻找流浪 delete 关键字,但找不到任何关键字。 :( 【参考方案1】:

每个人。所以,是的,我做错了什么。感谢 Escher,他建议我看看我的 admin.py 文件。事实证明,有一些重复的重载 delete()delete_model() 方法我忘记了,诗意地删除。在我摆脱了重复之后,一切都变得清晰起来。 Jon Clements 也是对的。

【讨论】:

以上是关于django admin/options.py TypeError: 需要 2 个选项,给定 3 个的主要内容,如果未能解决你的问题,请参考以下文章

##Django中Application labels aren't unique解决方法##

pycharm运行Django发生AppRegistryNotReady: Apps aren't loaded yet.

Jinja doesn´t render Django view

Django 使用allauth报错 RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an

Django- UnicodeDecodeError:'utf-8' codec can't decode 问题解决

如何在 django 模板中使用嵌套的 forloop 生成表时对 t 行进行编号