Дублирование загрузки медиа(CSS, JS) при использовании наследования классов в компонентах django

Я использую 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 в шаблоне, я хочу вызывать только Media (css, js), связанные с классом ChildA.

xxx.html

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

Однако, когда мы проверяем расширенный HTML, даже Media из ChildB вызывается, как показано ниже.

Расширенный конечный 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 компонента другого класса, имеющего того же родителя?

Мы уже подтвердили, что common.js вызывается только один раз, когда ChildB js указан пустым.

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

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

Вы можете изменить это поведение, используя django_components.middleware.ComponentDependencyMiddleware в своем промежуточном ПО.

Это пока недокументировано, но подробнее об этом можно прочитать здесь: https://github.com/EmilStenstrom/django-components/issues/71

Вернуться на верх