1

我必须想出一个相当复杂的设置来为用户启用基于数据库的样式选项。用户在 django 管理后端输入样式(如背景颜色、字体等)。

我通过将模板视图呈现为纯文本视图来创建动态 LESS 文件,如下所示:

视图.py:

class PlainTextView(TemplateView):
    """
    Write customized settings into a special less file to overwrite the standard styling
    """
    template_name = 'custom_stylesheet.txt'

    def get_context_data(self, **kwargs):
        context = super(PlainTextView, self).get_context_data(**kwargs)
        try:
            #get the newest PlatformCustomizations dataset which is also activated
            platform_customizations = PlatformCustomizations.objects.filter(apply_customizations=True).order_by('-updated_at')[0]
        except IndexError:
            platform_customizations = ''

        context.update({
            'platform_customizations': platform_customizations,
        })
        return context


    def render_to_response(self, context):
        return super(PlainTextView, self).render_to_response(context, content_type='plain/text')

模板custom_stylesheet.txt看起来有点像这样。它采用用户在管理后端输入的数据库样式条目:

@CIBaseColor: {{ dynamic_styles.ci_base_color }};
@CIBaseFont: {{ dynamic_styles.ci_base_font }};
...etc...

现在,我在 main.less 文件中包含这个动态的 less 文件和其他普通的静态 LESS 文件。像这样:

main.less:

@import "bootstrap_variables.less";

//this is the dynamicly created custom stylesheet out of the dynamic_styles app
@import url(http://127.0.0.1:8000/dynamic_styles/custom_stylesheet.less);

//Other styles
@import "my_styles.less";

此设置工作正常。我数据库中的动态变量被渲染到模板中,LESS 将我所有的 less 文件一起编译。

将代码推送到我的生产设置时遇到问题,我在其中编译 LESS 服务器端并使用 django-compressor 对其进行压缩。

我收到以下错误:

FilterError: [31mFileError: 'http://127.0.0.1:8000/dynamic_styles/custom_stylesheet.less' wasn't found.
[39m[31m in [39m/home/application/***/media/static-collected/styles/less/main.less[90m:13:0[39m
[90m12 //this is the dynamicly created custom stylesheet out of the dynamic_styles app[39m
13 [7m[31m[1m@[22mimport url(http://127.0.0.1:8000/dynamic_styles/custom_stylesheet.less);[39m[27m
[90m14 [39m[0m

有没有人遇到过这样的 django 压缩器问题?像这样动态创建的文件有问题吗?绝对网址可能有问题吗?

你能想到另一种解决方案,使用 django 压缩器动态生成更少的文件吗?

4

1 回答 1

0

我猜 Django-Compressor 无法读取动态创建的较少文件,这些文件只有在您点击 url 时才“即时”可用。至少我没有让它工作。该文件还需要在COMPRESS_ROOT.

现在,每次保存模型时,我都会将 less 文件物理写入磁盘。这是代码。它仍然需要一些改进,例如 try except 等。但它有效:

 def save(self, *args, **kwargs):

    #todo add try except
    less_file = open(os.path.join(settings.PROJECT_ROOT, 'media', 'static', "styles", "less", "custom_stylesheet.less"), "w")
    less_file.write(render_to_string('template/custom_stylesheet.txt', {'platform_customizations': self}))
    less_file.close()

    super(PlatformCustomizations, self).save(*args, **kwargs)
于 2012-10-13T09:01:44.967 回答