Django 1.11自定义小部件模板TemplateDoesNotExist

时间:2017-07-05 18:27:47

标签: python django

我正在尝试用自己的替换小部件模板,但我收到TemplateDoesNotExist错误。

在app \ forms.py中:

class SelectPlus(Select):
    template_name = 'selectplus.html'


class SimpleForm(ModelForm):
    somefield = ModelChoiceField(
        queryset=SomeObjects.objects.all(), 
        widget=SelectPlus(attrs={'url': 'custom_url_to_context'})
    )

在settings.py中

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [ROOT_PATH, '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',
        ],

    },
},

在调试跟踪中,我看到模板加载器不在应用程序文件夹或主模板文件夹中搜索:

enter image description here

但所有其他模板都运行正常。

2 个答案:

答案 0 :(得分:1)

在Django 1.11中:

NSError

导入要修改的窗口小部件。您可以在此处找到您的选择:https://docs.djangoproject.com/en/1.11/ref/forms/widgets/#built-in-widgets

创建子类并指定模板名称。

# app/widgets.py
from django.forms.widgets import DefaultWidget

class SelectPlus(DefaultWidget):
    template_name = 'app/selectplus.html'

创建模板。这是完全从django / forms / widgets / select.html复制的,但你可以在这里放任何你想要的东西。您还可以参考其他现有的小部件模板以获得灵感。您可以在此处找到您的选择:https://github.com/django/django/tree/master/django/forms/templates/django/forms/widgets

# app/templates/app/selectplus.html
<select name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}>{% for group_name, group_choices, group_index in widget.optgroups %}{% if group_name %}
  <optgroup label="{{ group_name }}">{% endif %}{% for option in group_choices %}
  {% include option.template_name with widget=option %}{% endfor %}{% if group_name %}
  </optgroup>{% endif %}{% endfor %}
</select>

导入您的客户窗口小部件(SelectPlus)并将其添加到表单中的字段。

最后,在您的模板中,渲染主要字段,它将引用app / templates / app / selectplus.html。

答案 1 :(得分:0)

您有两种方法可以解决此问题。

1)修复模板路径,如下所示。

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [ROOT_PATH, 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',
        ],

    },
}

2)在应用程序内添加模板文件夹。