首先,我使用的是 wagtail 5.2 和 django 4.2。
因此,我尝试按照与使用默认属性相关的文档中的说明进行操作。
我最初并不是继承自
WagtailImagesAppConfig
,所以我改变了我的代码。之后的文档表示将 wagtail.images
中的 settings.INSTALLED_APPS
替换为 CustomUsersAppConfig
的路径,并显示 wagtail.images
被注释掉。我发现,如果我这样做,那么引用 wagtailimages
的迁移将不起作用,因此 wagtail.images
需要保留在已安装的应用程序中。
但是,为了使其工作,由于继承,您需要在应用程序配置中指定一个标签,否则 django 会抱怨
Application labels aren't unique
。进行此更改后,我可以毫无问题地运行服务器。所以这样的事情是有效的:
class ImagesConfig(WagtailImagesAppConfig):
name = "xxxxx.images_custom"
label = "images_custom"
verbose_name = "Images"
default_attrs = {
"loading": "lazy",
}
但是,后来我遇到了我定义的默认属性没有添加到图片标签的问题。
首先,我了解了如何在 django 代码中创建应用程序配置。该文档说将已安装的应用程序设置为应用程序配置。因为它是这样定义的,所以 django 会继续正确创建它。但我发现,如果你只有应用程序名称(
"[APPDIRECTORYNAME].images_custom"
)并且不包含应用程序配置的路径,那么django将找到2个应用程序配置(ImagesConfig
和WagtailImagesAppConfig
)。然后它会查看它们以找到设置了 default = True
的一个。如果在其中任何一个上都没有找到,那么 django 就会继续从它自己的类创建应用程序配置,这意味着 default_attrs
将不存在,因为它没有使用应用程序配置类。因此,如果您仅在已安装的应用程序中定义目录和应用程序名称,则需要默认值 True。
学习这些并不能帮助解决问题,我的图片标签仍然没有得到我的默认属性。所以,我查看了代码,添加了这一行,以加载默认属性。
但是,我不确定这应该如何工作,因为默认属性是在自定义图像应用程序配置上定义的,而不是在 wagtail 图像应用程序配置上定义的。如果我在代码中放置一个断点,那么我可以看到,如果此代码正在加载自定义应用程序配置,则默认属性将正确返回。
所以,我相信我遇到的问题是:
这是正确的吗?或者,我有什么遗漏的吗?
INSTALLED_APPS = [
# This project
"xxxx.documents_custom",
"xxxx.images_custom",
"xxxx.users",
"xxxx.website",
# CodeRed CMS
"coderedcms",
"django_bootstrap5",
"django_sass",
"modelcluster",
"taggit",
"wagtailcache",
"wagtailseo",
# Wagtail
"wagtail",
"wagtail.admin",
"wagtail.contrib.forms",
"wagtail.contrib.redirects",
"wagtail.contrib.settings",
"wagtail.contrib.table_block",
"wagtail.contrib.typed_table_block",
"wagtail.documents",
"wagtail.embeds",
"wagtail.images",
"wagtail.search",
"wagtail.sites",
"wagtail.snippets",
"wagtail.users",
# Django
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.messages",
"django.contrib.sessions",
"django.contrib.staticfiles",
"django.contrib.sitemaps",
"django.forms",
"anymail",
]```
鉴于您的 ImagesConfig 继承自 WagtailImagesAppConfig,我认为您应该在 INSTALLED_APPS 中将
"wagtail.images"
替换为 "xxxx.images_custom"
。这就是我在我的项目中所做的,并且运行良好。