Django:TemplateDoesNotExist(rest_framework / api.html)


84

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

我的密码

@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正常状态的响应。这表明我无法获取我的HTML页面

我应该如何根据请求获取我的HTML

提前致谢

Answers:


191

确保您已rest_framework进入设置INSTALLED_APPS


它已经存在。我相信@api_view是不是让我来渲染HTML page..Is有任何其他的解决方案
科俄斯

您想通过打开django shell并查看INSTALLED_APPS来再次检查。api_view不太可能,因为我可以使用它,它将返回HTTP 415不支持的媒体类型。
利诺维亚'16

此函数与CURL命令一起使用时,我也得到响应,当我尝试使用浏览器呈现html时,出现上面列出的错误
Coeus 2016年

这个应该选有答案吗?
niran

48

确保安装了pip install djangorestframeworkrest_framework并将其包含在setting.py中

INSTALLED_APPS = [
    'rest_framework',
]

12

从旧的Django版本升级到Django 2.0时遇到了这个问题。我settings.pyTEMPLATE指令根本没有,所以我从新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。为我工作。


具体来说,在我的案例中,“ APP_DIRS”:True被忽略了;解决了我的问题。
abkonsta

12

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

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

方法1:使模板正常工作

确保REST框架包含INSTALLED_APPSsettings.py

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

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

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

方法2:返回JSON响应

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

您可以在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'})

有关详细信息,请参见REST Framework渲染器文档




2

除了'rest_framework'在您INSTALLED_APPS的内部添加内容外,请尝试在您的内部添加以下内容TEMPLATES.OPTIONS

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

1

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


1

而不是使用HttpResponse,请使用:

from rest_framework.response import Response

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.