Django: 模板不存在 (rest_framework/api.html)

164

在我的视图功能中,我想返回一个json对象(data1)和一些文本/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')

当我调用URL时,我得到状态码500,并显示以下错误:

TemplateDoesNotExist rest_framework/api.html

当我将其视为API进行检查时,我会收到200 ok状态的响应。这表明我无法获取我的HTML页面。

根据请求,我应该如何获取我的HTML页面?

15个回答

412

确保您的设置中有rest_frameworkINSTALLED_APPS中。


已经存在。我认为@api_view不允许我呈现HTML页面...有其他解决方案吗? - Coeus
你需要通过打开Django shell并查看INSTALLED_APPS来进行双重检查。这不太可能是api_view,因为我已经让它工作了,并且它会返回HTTP 415 Unsupported Media Type。 - Linovia
这个函数可以使用CURL命令,我也能够得到响应。但是当我尝试在浏览器中渲染HTML时,会出现上述列出的错误。 - Coeus
这应该被选为答案吗? - niran

85

请确保您安装了pip install djangorestframework 并在 setting.py 中包含了 rest_framework。

INSTALLED_APPS = [
    'rest_framework',
]

30

这是我尝试解释问题并将其他人的回复汇总到一个列表中的努力。感谢大家为我提供支持!

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

方法1:使模板工作

确保在settings.py中的INSTALLED_APPS中包含REST Framework:

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设置。看起来您甚至可能不需要在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'})

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


28

我也遇到过类似的问题。 请确保你的设置中已安装了rest_framework在"installed apps"中。


14
请确保你在你的 settings.py 文件中添加了 rest_frameworkinstalled_apps 中:
INSTALLED_APPS = [
    'rest_framework',
]

13

试着使用以下方法之一,肯定会对你有所帮助:

1:在 settings.py 应用程序列表中添加 rest_framework,应用程序的列出顺序可能是原因之一。

INSTALLED_APPS = [
    'rest_framework',
    ...
]

2: 检查您的模板设置。请查看后端、DIR 和 APP_DIRS。如果您自定义了rest-framework模板,请检查您定义的路径是否正确,并将APP_DIRS设置为True。在大多数情况下,这将解决问题。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ....
    }
]

3:检查默认渲染器类设置:

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

4:如果您在使用基于函数的视图上使用api_view装饰器,请确保正确提供渲染器,即

@renderer_classes([JSONRenderer])


终于!经过24小时的激烈搜索,我找到了解决我的问题的方法。谢谢! - Ragav Y

12

我在将旧版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指令,请将此代码添加到其中。这对我有用。


具体来说,在我的情况下,“APP_DIRS”:True被忽视了;这解决了我的问题。 - abkonsta

11

我也遇到了同样的问题,并发现在settings.py中没有将rest_framework添加到已安装的应用程序列表中。添加后,问题得到了解决。


5

setting.py 添加 rest_framework,如果未添加 rest_framework

示例:

INSTALLED_APPS = ["rest_framework"]


为什么需要这个呢? - undefined

3
已安装应用程序的顺序非常重要。在我的情况下,我将'rest_auth'添加到'rest_framework'之上,因此出现了此错误,但是当我重新排序它('rest_framework'在'rest_auth'之上,'rest_auth.registration','rest_framework.authtoken'等),此错误消失了。
以下是示例正确顺序:
INSTALLED_APPS = [
...
'rest_framework',
'rest_auth',
'rest_auth.registration',
'rest_framework.authtoken',
...

]

谢谢。


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