gpt4 book ai didi

python - 当调试为假时,链接到 Admin 中的外键会导致 AttributeError

转载 作者:太空狗 更新时间:2023-10-30 01:49:31 24 4
gpt4 key购买 nike

我在 models.py 文件中使用了以下代码:

创建指向外键的超链接

class ModelAdminWithForeignKeyLinksMetaclass(MediaDefiningClass): 

def __getattr__(cls, name):

def foreign_key_link(instance, field):
target = getattr(instance, field)
return u'<a href="../../%s/%s/%s">%s</a>' % (
target._meta.app_label, target._meta.module_name, target.id, unicode(target))

if name[:8] == 'link_to_':
method = partial(foreign_key_link, field=name[8:])
method.__name__ = name[8:]
method.allow_tags = True
setattr(cls, name, method)
return getattr(cls, name)
raise AttributeError

在 admin.py list_display 中,我将 link_to 添加到每个我想要外键链接的字段的开头。这工作得很好但是当我关闭调试时我得到一个属性错误。有什么建议吗?

最佳答案

我偶然发现了完全相同的问题,幸运的是,我已经解决了它。

原始解决方案(您使用的那个)来自this question ,我的解决方案基于它:

class ForeignKeyLinksMetaclass(MediaDefiningClass):

def __new__(cls, name, bases, attrs):

new_class = super(
ForeignKeyLinksMetaclass, cls).__new__(cls, name, bases, attrs)

def foreign_key_link(instance, field):
target = getattr(instance, field)
return u'<a href="../../%s/%s/%d/">%s</a>' % (
target._meta.app_label, target._meta.module_name,
target.id, unicode(target)
)

for name in new_class.list_display:
if name[:8] == 'link_to_':
method = partial(foreign_key_link, field=name[8:])
method.__name__ = name[8:]
method.allow_tags = True
setattr(new_class, name, method)

return new_class

好吧,您唯一需要做的就是将原来的 ModelAdminWithForeignKeyLinksMetaclass 替换为上面的那个。

然而,这还没有结束。最有趣的部分是为什么原来的解决方案会出问题。这个问题的答案在于here (第 31 行)和 here (第 244 行)。

当 DEBUG 打开时,Django 会尝试验证所有已注册的 ModelAdmin(第一个链接)。 cls 是一个 SomeAdmin(即它的元类的一个实例)。当调用 hasattr 时,python 会尝试在类 SomeAdmin 或其父类(super class)之一中查找属性 field。既然不可能,它的类(即 SomeAdmin 的元类)的 __getattr__ 被调用,其中一个新方法被添加到类 SomeAdmin。因此,在渲染界面时,SomeAdmin 已经打好了补丁,Django 能够找到所需的字段(第二个链接)。

当 DEBUG 为 False 时,Django 会跳过验证。当界面渲染时,Django 试图找到一个字段(再次,第二个链接),但是这次 SomeAdmin 没有打补丁,而且 model_admin 不是类 SomeAdmin,它是它的实例。因此,试图在 model_admin 中找到属性 name,python 无法做到这一点,它也无法在其类中找到它 (SomeAdmin) 以及它的任何父类(super class),因此会引发异常。

关于python - 当调试为假时,链接到 Admin 中的外键会导致 AttributeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6473340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com