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