TemplateDoesNotExist - Django 错误

Posted

技术标签:

【中文标题】TemplateDoesNotExist - Django 错误【英文标题】:TemplateDoesNotExist - Django Error 【发布时间】:2014-02-19 21:56:02 【问题描述】:

我正在使用 Django Rest 框架。我不断收到错误

Exception Type: TemplateDoesNotExist
Exception Value: rest_framework/api.html

我不知道我怎么会出错。这是我第一次尝试 REST Framework。 这是代码。

views.py

import socket, json
from modules.data.models import *
from modules.utils import *
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from modules.actions.serializers import ActionSerializer


@api_view(['POST'])
@check_field_exists_wrapper("installation")
def api_actions(request, format = None):

    action_type = request.POST['action_type']
    if action_type == "Shutdown" : 
        send_message = '1'
        print "Shutting Down the system..."
    elif action_type == "Enable" : 
        send_message = '1'
        print "Enabling the system..."
    elif action_type == "Disable" : 
        send_message = '1'
        print "Disabling the system..."
    elif action_type == "Restart" : 
        send_message = '1'
        print "Restarting the system..."

    if action_type in ["Shutdown", "Enable", "Disable"] : PORT = 6000
    else : PORT = 6100

    controllers_list = Controller.objects.filter(installation_id = kwargs['installation_id'])

    for controller_obj in controllers_list:
        ip = controller_obj.ip
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((ip, PORT))
            s.send(send_message)
            s.close()
        except Exception as e:
            print("Exception when sending " + action_type +" command: "+str(e))

    return Response(status = status.HTTP_200_OK)

models.py

class Controller(models.Model):
    id = models.IntegerField(primary_key = True)
    name = models.CharField(max_length = 255, unique = True)
    ip = models.CharField(max_length = 255, unique = True)
    installation_id = models.ForeignKey('Installation')

serializers.py

从 django.forms 导入小部件 从 rest_framework 导入序列化程序 从 modules.data.models 导入 *

class ActionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Controller
        fields = ('id', 'name', 'ip', 'installation_id')

urls.py

from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = patterns('modules.actions.views',
    url(r'^$','api_actions',name='api_actions'),
)

【问题讨论】:

您的 settings.py INSTALLED_APPS 中是否列出了“rest_framework”? Noobest 错误。谢谢你。 我还有一个疑问。我如何获得一个表格,以便我在表格中发布一些数据,用这些值访问数据库并获得结果? How do I get the form? @ScottWoodall 请发布答案,并获得一些积分! 【参考方案1】:

确保您的settings.py INSTALLED_APPS 中列出了rest_framework

【讨论】:

也可能是因为没有注册 DRF 的依赖。就我而言,我必须将'django_hstore', 添加到INSTALLED_APPS【参考方案2】:

对我来说,rest_framework/api.html 实际上由于安装损坏或其他未知原因而在文件系统上丢失。重新安装djangorestframework 解决了这个问题:

$ pip install --upgrade djangorestframework

【讨论】:

同样的事情发生在我身上。请注意,该命令将升级到可能不兼容的版本(即使您的 setup.py 和/或 requirements.txt 另有说明)。您可以尝试 pip 卸载/安装或指定确切的版本。【参考方案3】:

请注意,DRF 会尝试以请求的相同格式返回数据。在您的浏览器中,这很可能是 HTML。要指定替代响应,请使用?format= 参数。例如:?format=json

TemplateDoesNotExist 错误最常发生在您在浏览器中访问 API 端点并且您确实没有rest_framework 包含在您的已安装应用程序列表中,正如其他受访者所述.

如果您的应用列表中没有包含 DRF,但又不想使用 HTML Admin DRF 页面,请尝试使用其他格式来“避开”此错误消息。

更多来自文档的信息:http://www.django-rest-framework.org/topics/browsable-api/#formats

【讨论】:

【参考方案4】:

不是你的情况,但也可能的原因是为Django定制loaders。例如,如果您在设置中有(自Django 1.8):

TEMPLATES = [

    ...
    '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'
        ],
        'loaders': [
            'django.template.loaders.filesystem.Loader',
        ],
        ...
    
]

Django 不会尝试使用模板查看应用程序文件夹,因为您应该为此明确地将 django.template.loaders.app_directories.Loader 添加到 loaders 中。

注意,默认情况下django.template.loaders.app_directories.Loader 包含在loaders 中。

【讨论】:

WARNINGS: ?: (1_8.W001) 独立的 TEMPLATE_* 设置在 Django 1.8 中已弃用,并且 TEMPLATES 字典优先。您必须将以下设置的值放入默认的 TEMPLATES 字典中:TEMPLATE_DEBUG。【参考方案5】:

我遇到了同样的错误信息。就我而言,这是由于将后端设置为 Jinja2。在我的设置文件中:

TEMPLATES = [

    'BACKEND': 'django.template.backends.jinja2.Jinja2',
...

改回默认值解决了这个问题:

TEMPLATES = [

    'BACKEND': 'django.template.backends.django.DjangoTemplates',
...

仍然不确定是否有办法将 Jinja2 后端与 rest_framework 一起使用。

【讨论】:

【参考方案6】:

即使我们没有在已安装的应用程序中添加“rest_framework”,我们也会收到错误消息。 因此,如果您遇到错误,请也检查一下。

【讨论】:

欢迎来到***。这个问题大约有 8 年的历史,并且已经有一个公认的答案。

以上是关于TemplateDoesNotExist - Django 错误的主要内容,如果未能解决你的问题,请参考以下文章

TemplateDoesNotExist 异常

Django 管理站点:TemplateDoesNotExist?

TemplateDoesNotExist - Django 错误

在 / 处获取 TemplateDoesNotExist

TemplateDoesNotExist:模板路径错误

TemplateDoesNotExist :在 Django 上未检测到模板