【问题标题】:Django: TemplateDoesNotExist (rest_framework/api.html)Django: TemplateDoesNotExist (rest_framework/api.html)
【发布时间】:2016-11-16 22:29:59
【问题描述】:

在我的视图函数中,我想返回一个 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')

当我调用 url 时,我得到状态码 500,错误如下所示

TemplateDoesNotExist rest_framework/api.html

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

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

    确保您在设置的INSTALLED_APPS 中有rest_framework

    【讨论】:

    • 它已经存在。我相信@api_view 不允许我渲染 html 页面。有没有其他解决方案
    • 您想通过打开 django shell 并查看 INSTALLED_APPS 来仔细检查。 api_view 不太可能,因为我让它工作了,它会返回 HTTP 415 Unsupported Media Type。
    • 这个函数适用于 CURL 命令,我也得到响应,当我尝试用我的浏览器渲染 html 时,我得到上面列出的错误
    • 这个应该选有答案?
    【解决方案2】:

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

    INSTALLED_APPS = [
        'rest_framework',
    ]
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 救了我的命。谢谢!
      【解决方案4】:

      这是我试图解释问题并将其他人的回答收集到一个列表中的尝试。感谢大家给了我可以站立的肩膀!

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

      方法 1:使模板工作

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

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

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

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

      方法 2:返回 JSON 响应

      如果您告诉 REST Framework 呈现 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'})
      

      详情请见the REST Framework renderers documentation

      【讨论】:

        【解决方案5】:

        我从旧 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。为我工作。

        【讨论】:

        • 具体来说,在我的情况下,'APP_DIRS': True 被忽略了;这解决了我的问题。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          确保您将rest_framework 添加到您的installed_apps 到您的settings.py 文件中:

          INSTALLED_APPS = [
              'rest_framework',
          ]
          

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                不要使用 HttpResponse,而是使用:

                from rest_framework.response import Response
                
                return Response(data=message, status=status.HTTP_200_OK)
                

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

                    已安装应用的顺序很重要。在我的情况下,我在“rest_framework”上方添加了“rest_auth”,所以它给出了这个错误,但是当我重新排序时(“rest_auth”上方的“rest_framework”、“rest_auth.registration”、“rest_framework.authtoken”等),这个错误被清除了。

                    样品正确顺序如下:

                    INSTALLED_APPS = [

                    ...
                    'rest_framework',
                    'rest_auth',
                    'rest_auth.registration',
                    'rest_framework.authtoken',
                    ...
                    

                    ]

                    谢谢。

                    【讨论】:

                      猜你喜欢
                      • 2023-03-03
                      • 2011-06-13
                      • 2014-10-17
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-09-29
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-06-02
                      相关资源
                      最近更新 更多