Django静态文件:任何获得更细粒度控制的方法?

时间:2014-02-17 17:23:18

标签: django

Django的静态文件功能允许您指定某些目录以“收集”到面向公众的文件夹中。这很好,但有没有办法获得更细粒度的控制而不仅仅是拥有某些文件夹?例如,无论如何都要指定......

  • 包含特定文件
  • 排除特定文件
  • 排除特定子目录

例如,我想说“收集这一个文件夹中的所有文件,除了这个文件和这个目录”。或者,如果我可以选择特定文件,然后选择那个目录的所有子目录(除了我不想要的那个),我可以完成同样的事情。

有可能吗?

1 个答案:

答案 0 :(得分:3)

我写了一个自定义的django-admin命令来启用COLLECT_STATIC_IGNORE设置。

首先在任何app文件夹中创建以下结构:

appname/
    management/
        __init__.py
        commands/
            __init__.py
            _private.py
            collectstatic.py

在collectstatic.py中:

from django.contrib.staticfiles.management.commands.collectstatic import Command
from django.conf import settings

class Command(Command):

    def set_options(self, **options):
        """
        Set instance variables based on an options dict
        """
        self.interactive = options['interactive']
        self.verbosity = int(options.get('verbosity', 1))
        self.symlink = options['link']
        self.clear = options['clear']
        self.dry_run = options['dry_run']
        ignore_patterns = options['ignore_patterns']
        if options['use_default_ignore_patterns']:
            ignore_patterns += ['CVS', '.*', '*~']
            ignore_patterns += settings.COLLECT_STATIC_IGNORE # Added.
        self.ignore_patterns = list(set(ignore_patterns))
        self.post_process = options['post_process']

或者,甚至更好,就像@CantucciHQ建议的那样,使用super

class Command(Command):

    def set_options(self, **options):
        super(Command, self).set_options(**options)
        self.ignore_patterns += settings.COLLECT_STATIC_IGNORE        
        self.ignore_patterns = list(set(self.ignore_patterns))

这将覆盖de build-in set_options命令中的collectstatic函数。

在settings.py中添加COLLECT_STATIC_IGNORE。 此示例忽略scss文件和管理文件夹中的所有文件。

COLLECT_STATIC_IGNORE = ['*.scss', 'admin', ... ] 

然后:

python manage.py collectstatic

标志有效,因此在向COLLECT_STATIC_IGNORE添加内容后,您可能希望在尝试复制或链接原始文件之前使用--clear清除现有文件。

python manage.py collectstatic --clear