模板不存在 - Django 错误

121

我在使用Django Rest Framework时遇到了错误。

Exception Type: TemplateDoesNotExist
Exception Value: rest_framework/api.html
我不知道我哪里做错了。这是我第一次尝试使用REST框架。 这是代码。
视图.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')

序列化器.py

从django.forms模块导入widgets, 从rest_framework模块导入serializers, 从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'),
)

34
你的 settings.py 文件中是否列出了 "rest_framework" 于 INSTALLED_APPS 中? - Scott Woodall
初学者常犯的错误。感谢它。 - python-coder
我还有一个疑问。 我该如何在此获取一个表单,以便我可以在表单中发布一些数据,使用这些值击中数据库并获取结果?“我该如何获取表单?” - python-coder
@ScottWoodall请发布答案并获得一些积分! - Udi
6个回答

300

请确保你在 settings.pyINSTALLED_APPS 列表中有 rest_framework


这也可能是由于未注册DRF的依赖关系导致的。在我的情况下,我不得不将'django_hstore'添加到INSTALLED_APPS中。 - shacker

6
请注意,DRF试图以与请求相同的格式返回数据。从您的浏览器中,这很可能是HTML。要指定替代响应,请使用?format=参数。例如:?format=jsonTemplateDoesNotExist错误通常发生在您在浏览器中访问API端点时,而您的已安装应用列表中没有包含rest_framework,正如其他回答者所描述的那样。
如果您没有在应用列表中包含DRF,但不想使用HTML Admin DRF页面,请尝试使用另一种格式来“绕过”此错误消息。
有关更多信息,请参见文档:http://www.django-rest-framework.org/topics/browsable-api/#formats

5

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

$ pip install --upgrade djangorestframework

1
我也遇到了同样的问题。请注意,该命令可能会升级到一个不兼容的版本(即使你的 setup.py 和/或 requirements.txt 文件中没有这样的说明)。你可以尝试使用 pip uninstall/install 命令或指定精确的版本号。 - Jorge Vargas

4

虽然不是你的情况,但也有可能是因为定制了Djangoloaders。例如,如果你在设置中有以下代码(自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 中。


警告: ?: (1_8.W001) 独立的TEMPLATE_*设置在Django 1.8中已被弃用,TEMPLATES字典优先。您必须将以下设置的值放入默认的TEMPLATES字典中:TEMPLATE_DEBUG。 - andilabs

0

我遇到了相同的错误信息。在我的情况下,这是由于将后端设置为Jinja2引起的。在我的设置文件中:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.jinja2.Jinja2',
...

将此更改回默认值解决了问题:
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
...

仍然不确定是否有一种方法可以使用Jinja2后端与rest_framework一起使用。


0
我们即使忘记在已安装的应用程序中添加“rest_framework”,仍然会遇到错误。如果您遇到错误,请也检查一下这个问题。

1
欢迎来到StackOverflow。这个问题已经存在8年了,且已经有一个被采纳的答案。 - RajeshM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接