覆盖 Django 小部件默认模板

Posted

技术标签:

【中文标题】覆盖 Django 小部件默认模板【英文标题】:Override Django widgets default templates 【发布时间】:2018-06-21 22:03:55 【问题描述】:

我想覆盖 Django (2.01) 小部件模板,因为我需要为每个输入、标签添加类,并以不同的方式定位它们

app
 - templates
 - app 
    - django
       - forms
           - widgets
             - input.html

app
 - templates
   - django
      - forms
          - widgets
             - input.html

或模板项目目录:

- templates
   - django
      - forms
          - widgets
             - input.html

它们都不起作用,(即使我在文档中建议这样做,并且从我在 *** 上看到的答案),它仍然从默认加载。

作为通用小部件模板,我更喜欢将它们放在模板项目目录中,但默认情况下,我只在已安装的应用程序中搜索小部件。

【问题讨论】:

我也没有运气。 【参考方案1】:

看起来这是 Django 1.11 中的一个问题。

Django widget template override does not search in the project template directory. How to fix?

这有点烦人。通过更改您的设置可以解决此问题。所以你的主站点必须有这些设置。

INSTALLED_APPS = [
    ...
    'django.forms',
    ...
]

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

很遗憾,您无法通过已安装的应用程序自动执行此操作。如果已安装的应用覆盖了 django 模板小部件,则需要对其进行记录,并且用户必须在其站点设置中添加此代码。

您无需更改“模板”设置中的任何内容。这是我的模板的外观供参考。

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': 
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        ,
    ,
]

【讨论】:

这看起来有点连线,但它确实有效。在 Django 上测试2.x

以上是关于覆盖 Django 小部件默认模板的主要内容,如果未能解决你的问题,请参考以下文章

如何使用每个选项的模板覆盖 ModelChoiceField / ModelMultipleChoiceField 默认小部件

使用模板渲染 django 小部件?

如何在我的自定义小部件模板中包含内置的 django 小部件模板?

以自定义形式使用 Django 时间/日期小部件

如何从 Django 模板变量填充 jQuery Datepicker 小部件?

关于覆盖外键表单小部件以接收用户输入的 Django 最佳实践