TemplateDoesNotExist - błąd Django


117

Używam Django Rest Framework. i ciągle otrzymuję błąd

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

Nie wiem, jak się mylę. Po raz pierwszy wypróbowuję REST Framework. To jest kod.

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

z django.forms importuj widżety z rest_framework importuj serializatory z modules.data.models import *

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
Czy masz wpis „rest_framework” w pliku settings.py INSTALLED_APPS?
Scott Woodall

Najgorszy błąd. Dzięki za to.
python-coder

Mam inne wątpliwości. Jak uzyskać formularz w tym celu, aby opublikować dane w formularzu, trafić do bazy danych z tymi wartościami i uzyskać wynik? How do I get the form?
python-coder

@ScottWoodall, opublikuj odpowiedź i zbierz kilka punktów!
Udi

Odpowiedzi:


284

Upewnij się, że rest_frameworkwpisałeś w swoim settings.py INSTALLED_APPS.


Może również wynikać z niezarejestrowania zależności od DRF. W moim przypadku musiałem dodać 'django_hstore',do INSTALLED_APPS.
shacker

5

Dla mnie rest_framework/api.htmlfaktycznie brakowało w systemie plików z powodu uszkodzonej instalacji lub z innego nieznanego powodu. Ponowna instalacja djangorestframeworkrozwiązała problem:

$ pip install --upgrade djangorestframework

1
To samo przytrafiło się mnie. Zauważ, że polecenie zaktualizuje się do być może niekompatybilnej wersji (nawet jeśli plik setup.py i / lub Requirements.txt mówi inaczej). Możesz spróbować odinstalować / zainstalować pip lub określić dokładną wersję.
Jorge Vargas

5

Należy pamiętać, że fundusz DRF próbuje zwrócić dane w tym samym formacie, którego zażądano. Z Twojej przeglądarki najprawdopodobniej jest to HTML. Aby określić alternatywną odpowiedź, użyj ?format=parametru. Na przykład: ?format=json.

TemplateDoesNotExistBłąd występuje najczęściej gdy odwiedzasz punkt końcowy API w przeglądarce a ty nie mają rest_frameworkzawarte na liście zainstalowanych aplikacji, jak opisano przez innych respondentów.

Jeśli nie masz DRF na liście aplikacji, ale nie chcesz korzystać ze strony HTML Admin DRF, spróbuj użyć alternatywnego formatu dla tego komunikatu o błędzie „krok po kroku”.

Więcej informacji z dokumentacji tutaj: http://www.django-rest-framework.org/topics/browsable-api/#formats


4

Nie twój przypadek, ale również możliwy powód jest dostosowany loadersdo Django. Na przykład, jeśli masz w ustawieniach (od 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 nie będzie próbował przeglądać folderów aplikacji z szablonami, ponieważ powinieneś wyraźnie dodać django.template.loaders.app_directories.Loaderdo loaderstego.

Zauważ, że domyślnie django.template.loaders.app_directories.Loaderzawarte w loaders.


OSTRZEŻENIA:?: (1_8.W001) Niezależne ustawienia TEMPLATE_ * zostały wycofane w Django 1.8 i słownik TEMPLATES ma pierwszeństwo. Musisz umieścić wartości następujących ustawień w domyślnym dyktandzie TEMPLATES: TEMPLATE_DEBUG.
andilabs

0

Pojawił się ten sam komunikat o błędzie. W moim przypadku było to spowodowane ustawieniem backendu na Jinja2. W moim pliku ustawień:

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

Zmiana tego z powrotem na domyślne rozwiązała problem:

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

Nadal nie jestem pewien, czy istnieje sposób na użycie zaplecza Jinja2 z rest_framework.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.