微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在表单小部件模板内使用sekizai的addtoblock标签

如何解决如何在表单小部件模板内使用sekizai的addtoblock标签

我正在编写一个具有自定义小部件的自定义表单字段。小部件需要一些静态资产。其模板如下所示:

{% load sekizai_tags static %}
<div id="myWidget"> ... </div>

{% addtoblock "css" %}
<link rel="stylesheet" href="{% static 'my_app/css/widget.css' %}">{% endaddtoblock %}
{% addtoblock "js" %}
<script src="{% static 'my_app/js/widget.js' %}"></script>{% endaddtoblock %}

但是,这不起作用。我得到:You must enable the 'sekizai.context_processors.sekizai' template context processor or use 'sekizai.context.SekizaiContext' to render your templates.

我猜这是因为表单(和小部件)无法访问请求对象?有办法解决吗?

我在sekizai source中发现提到SekizaiContext为...

在以下位置使用替代上下文代替RequestContext 没有可用的请求。

...但是我不知道该怎么做。

请注意,我不想开始传递请求。这不是一个可以接受的解决方案,因为我的自定义字段可以重用。它应该可以以任何形式使用,而无需进一步修改

更新

实际上,在发布了我自己的问题的答案并……进行了更多思考之后,我意识到使用Media类的答案并不能真正解决问题。毕竟,媒体类的缺点是为什么首先需要sekizai的原因。

使用Media类意味着:

# widgets.py

class MyWidget(widgets.Widget):
    template_name = "my_widget.html"
    # other stuff

    class Media:
            css = {"all": "my_app/css/widget.css"}
            js = ("my_app/js/widget.js")

然后,将{{ form.media }}添加到包含表单的模板中。因此,将不会解决发布此问题的初衷。即在窗口小部件模板中使用addtoblock,以便可以按原样使用该字段,而无需对其他模板进行进一步修改

此外,如果使用{{ form.media }},则html标签将在表单之后立即呈现,除非我将其包装为:{% addtoblock "css" %}{{ form.media }}{% endaddtoblock %}。然后将css和js都添加到同一位置(而通常人们会希望在头部添加css链接标记,在主体之后添加js脚本标记)。

如果任何人都有在无法访问请求对象的模板中使用sekizai的addtoblock的解决方案,仍然欢迎您!

更新2

我能够使用addtoblock并避免在小部件中重载get_context方法的上下文错误,像这样的小部件子类:

# widget.py
class MyWidget(widgets.Widget):

def get_context(self,name,value,attrs):
        context = super().get_context(name,attrs)
        sezikai_ctx_var = get_varname()
        sekizai_ctx = SekizaiContext().flatten()
        context.update({sezikai_ctx_var: sekizai_ctx[sezikai_ctx_var]})
        return context

但是,资产仍未呈现...

解决方法

经过一番思考,然后阅读了文档,我意识到django是开箱即用的,用于表单和小部件的静态资产:

https://docs.djangoproject.com/en/3.1/topics/forms/media/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。