0

我试图弄清楚如何将 Genshi 中的 CSS 添加到一些动态生成的标记中。我试图避免内联 CSS,理想情况下,规则会出现在<head/>父文档的标签中。

我正在使用看起来像这样的现有代码(为了简化,我从原始代码中重写了它,所以我可能有一些语法错误;但原始代码有效,所以我认为如果有语法错误,你可以忽略):


模板/小部件/file_widget.html

<html xmlns:py="http://genshi.edgewall.org/"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  py:strip="">
<head>
  <style type="text/css">
      .file-widget {
          background-color:#eee; display:inline-block; padding:4px;
      }
  </style>
</head>
<py:def function="file_widget(file_name)">
  <div class=".file-widget">
    ...
  </div>
</py:def>
</html>

小部件.py

class FileWidget:

...

    def html():
        markup_template = genshi.template.MarkupTemplate('''
            <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude">
                <xi:include href="my_project/widgets/file_widget.html" />
                ${description}
                ${file_widget(file_name)}
            </html>''')
        markup = markup_template.generate(file_name = self.file_name,  description = genshi.core.Markup(self.description))
        return markup.render('html', doctype = 'html')

模板/main_page.html

<div py:for='widget in app.widgets'>
    ${ genshi.core.Markup( widget.html() ) }
</div>

不幸的是,<style/>标签被渲染了两次:一次,正如我所希望的,在原始文档<head/>中,然后小部件<head/>再次被渲染。

如何更改代码以在正确的位置正确包含 CSS?由于这是协作代码,因此感谢您进行少量更改和更清晰的代码!

感谢您的阅读和您的帮助。

4

1 回答 1

1

您可能想要使用一个类似的小部件库ToscaWidget2,它旨在实际管理带有资源的小部件。

否则,您可能希望使用静态文件框架,例如fanstatic它为资源包含提供支持:http: //www.fanstatic.org/en/1.0a5/quickstart.html#include-resources-with-fanstatic

如果您想推出自己的自定义解决方案,您应该在呈现小部件时(如在请求中)在某处注册资源,然后在呈现模板时将它们添加到 head 标签。这实际上是做什么tw2.core.resources的:https ://github.com/toscawidgets/tw2.core/blob/develop/tw2/core/resources.py

于 2014-09-13T13:04:29.797 回答