Django:TemplateDoesNotExist(rest_framework / api.html)

时间:2016-07-14 06:21:38

标签: django django-views django-rest-framework

在我的视图函数中,我想返回一个json对象(data1)和一些text / html(form)。这可能吗?

我的代码

@api_view(['POST'])
@permission_classes((AllowAny,))
def create_user(request):
    if request.is_ajax():
        if request.method == 'POST':
            serializer = SignupSerializer(data=request.data)
            print 'ser'
            print serializer
            if not serializer.is_valid():
                return Response(serializer.errors,\
                                status=status.HTTP_400_BAD_REQUEST)
            else:
                serializer.save()
                data={'status': 'Created','message': 'Verification email has been sent to your email. Please verify your account.'}
                return Response(data, template_name='register.html')
    else:
        return HttpResponse('hello world')

当我调用网址时,我会收到状态代码500,错误如下所示

  

TemplateDoesNotExist rest_framework / api.html

当我作为API检查时,我得到200 ok状态的响应。这表明我无法获取我的HTML页面

我应该如何根据请求获取html

提前致谢

10 个答案:

答案 0 :(得分:66)

确保您的设置rest_framework

中有INSTALLED_APPS

答案 1 :(得分:12)

这是我试图解释问题并将其他所有人的答复收集到一个列表中的尝试。感谢大家给我的肩膀站起来!

我相信这是因为Django REST Framework想要呈现模板(rest_framework/api.html),但找不到该模板。似乎有两种方法可以解决此问题:

方法1:使模板正常工作

确保REST框架包含在settings.py的{​​{3}}中:

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

并确保模板配置中INSTALLED_APPSTrue(如果未指定,则默认为False)。这使Django可以在已安装的应用程序中查找模板。这是一个似乎可行的最小配置,尽管您可能在此处有更多配置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
    },
]

方法2:返回JSON响应

如果您告诉REST框架呈现JSON响应,则它不需要使用模板,因此您无需如上所述更改APP_DIRS设置。似乎您甚至都不需要在INSTALLED_APPS中列出rest_framework,尽管出于其他原因可能有必要在其中列出它。

您可以在settings.py中全局执行此操作:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ]
}

或者,如果您使用的是@api_view装饰器,则可以在每个视图上指定JSONRenderer:

@api_view(['GET'])
@renderer_classes([JSONRenderer])
def some_view(request):
    return Response({'status': 'yay'})

有关详细信息,请参见APP_DIRS

答案 2 :(得分:11)

从旧的Django版本升级到Django 2.0时,我遇到了这个问题。我的settings.py根本没有TEMPLATE指令,所以我从新的django-admin.py startproject ...运行中抓住了以下内容:

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

如果您的settings.py中没有TEMPLATES指令,请将其添加到settings.py。为我工作。

答案 3 :(得分:6)

我遇到了相同的问题,发现rest_framework没有添加到settings.py中已安装的应用程序中。添加它解决了我的问题。

答案 4 :(得分:4)

我也有类似的问题。 确保在“已安装的应用”中的设置中安装了rest_framework

答案 5 :(得分:2)

确保安装pip install djangorestframework并将rest_framework包含在设置中。py

INSTALLED_APPS = [
    'rest_framework',
]

答案 6 :(得分:1)

除了在'rest_framework'中添加INSTALLED_APPS之外,请尝试在TEMPLATES.OPTIONS中添加以下内容:

'loaders': [
     'django.template.loaders.filesystem.Loader',
     'django.template.loaders.app_directories.Loader'
],

答案 7 :(得分:1)

而不是使用HttpResponse,请使用:

from rest_framework.response import Response

return Response(data=message, status=status.HTTP_200_OK)

答案 8 :(得分:0)

我遇到了同样的问题,我发送的响应是空的。尝试在Response()函数的create_user中放入其他信息,以检查其是否完全有效

答案 9 :(得分:0)

在该视图上方添加此装饰器 @renderer_classes([JSONRenderer])