TemplateDoesNotExist-Djangoエラー


116

私はDjango Rest Frameworkを使用しています。エラーが発生し続ける

Exception Type: TemplateDoesNotExist
Exception Value: rest_framework/api.html

私はどうやって間違っているのか分かりません。RESTフレームワークを実際に試すのはこれが初めてです。これはコードです。

views.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')

serializers.py

django.formsからウィジェットをインポートrest_frameworkからウィジェットをインポート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
「rest_framework」がsettings.py INSTALLED_APPSにリストされていますか?
Scott Woodall 2014年

最高の間違い。それをありがとう。
python-coder

別の疑問があります。これでフォームを取得してフォームにデータを投稿し、それらの値でDBをヒットして結果を取得するにはどうすればよいですか?How do I get the form?
python-coder

@ScottWoodallが回答を投稿して、ポイントを獲得してください!
Udi

回答:


283

rest_frameworkリストされていることを確認してくださいsettings.py INSTALLED_APPS


DRFの依存関係を登録しないことも原因となる可能性があります。私の場合、に追加する'django_hstore',必要がありましたINSTALLED_APPS
シャッカー2016

5

私にとっては、rest_framework/api.htmlインストールの破損やその他の不明な理由により、実際にはファイルシステムに欠落していた。再インストールdjangorestframeworkすると問題が修正されました:

$ pip install --upgrade djangorestframework

1
同じことが私にも起こりました。コマンドは互換性のない可能性があるバージョンにアップグレードされることに注意してください(たとえsetup.pyやrequirements.txtが別のことを言っていても)。pip uninstall / installを試すか、正確なバージョンを指定できます。
ホルヘバルガス

5

DRFが要求された同じ形式でデータを返そうとすることに注意してください。あなたのブラウザから、これはおそらくHTMLです。代替応答を指定するには、?format=パラメータを使用します。例:?format=json

このTemplateDoesNotExistエラーは、他の回答者が説明しているように、ブラウザーでAPIエンドポイントにアクセスしてて、rest_frameworkインストール済みアプリのリストに含まれていない場合に最もよく発生します。

アプリのリストにDRFが含まれていないが、HTML管理DRFページを使用したくない場合は、このエラーメッセージを「回避」するために別の形式を使用してみてください。

こちらのドキュメントの詳細:http : //www.django-rest-framework.org/topics/browsable-api/#formats


4

あなたのケースではなく、考えられる理由もに合わせてカスタマイズさloadersれていDjangoます。たとえば、設定(から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.Loaderloaders、そのために。

デフォルトでは、にdjango.template.loaders.app_directories.Loader含まれていることに注意してくださいloaders


警告:?:(1_8.W001)スタンドアロンのTEMPLATE_ *設定はDjango 1.8で廃止され、TEMPLATES辞書が優先されます。次の設定の値をデフォルトのTEMPLATES dictに入れる必要があります:TEMPLATE_DEBUG。
andilabs 16

0

同じエラーメッセージが表示されました。私の場合、バックエンドをJinja2に設定したことが原因でした。私の設定ファイルで:

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

これをデフォルトに戻すと問題が解決しました:

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

Jinja2バックエンドをrest_frameworkで使用する方法があるかどうかはまだわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.