在django组件中使用类继承时加载重复的媒体(CSS,JS)

xwbd5t1u  于 2023-03-24  发布在  Go
关注(0)|答案(1)|浏览(73)

我使用的是django-components,公共部分继承自父类,子类注册为组件,编写如下
components.py

from django_components import component

class Parent(component.Component):
    def get_context_data(self, data):
        return {
            "data": data,
        }

@component.register("aaa")
class ChildA(Parent):
    template_name = "/aaa.html"

    class Media:
        css = ["css/my.css", "css/test/aaa.css"]
        js = "js/common.js"

@component.register("bbb")
class ChildB(Parent):
    template_name = "/bbb.html"

    class Media:
        css = ["css/my.css", "css/test/bbb.css"]
        js = "js/common.js"

当我调用模板中的aaa组件时,我只想调用与ChildA类关联的Media(css,js)。
xxx.html

{% component "aaa" data=""%}

然而,当我们检查扩展的HTML时,甚至调用了ChildB的Media,如下所示。
扩展的最终HTML

<script src="js/common.js" ></script>
<script src="js/common.js" ></script>

<link href="css/my.css" media="all" rel="stylesheet">
<link href="css/test/aaa.css" media="all" rel="stylesheet">
<link href="css/my.css" media="all" rel="stylesheet">
<link href="css/test/bbb.css" media="all" rel="stylesheet">

如何避免调用具有相同父类的另一个类的组件的Media?
我们已经确认,当ChildB js被指定为空时,common.js只被调用一次。

@component.register("bbb")
class ChildB(Parent):
    template_name = "/bbb.html"

    class Media:
        css = ["css/my.css", "css/test/bbb.css"]
        js = ""
bvjveswy

bvjveswy1#

您可以通过在中间件中使用django_components.middleware.ComponentDependencyMiddleware来改变这种行为。
这是尚未记录的,但你可以在这里阅读更多:https://github.com/EmilStenstrom/django-components/issues/71

相关问题