Дублирование загрузки медиа(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