TemplateDoesNotExist - Kesalahan Django


117

Saya menggunakan Django Rest Framework. dan saya terus mendapatkan kesalahan

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

Saya tidak tahu bagaimana saya salah. Ini adalah pertama kalinya saya mencoba REST Framework. Ini adalah kode.

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

dari django.forms impor widget dari rest_framework impor serializers dari 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
Apakah Anda memiliki "rest_framework" di dalam settings.py Anda INSTALLED_APPS?
Scott Woodall

Kesalahan noobest. Terimakasih untuk ini.
python-coder

Saya ragu lagi. Bagaimana cara mendapatkan formulir ini sehingga saya memposting beberapa data dalam formulir, menekan DB dengan nilai-nilai itu dan mendapatkan hasilnya? How do I get the form?
python-coder

@ScottWoodall tolong posting jawabannya, dan dapatkan beberapa poin!
Udi

Jawaban:


284

Pastikan Anda telah rest_frameworkterdaftar di settings.py INSTALLED_APPS.


Bisa juga akibat tidak mendaftarkan ketergantungan DRF. Dalam kasus saya saya harus menambahkan 'django_hstore',untuk INSTALLED_APPS.
shacker

5

Bagi saya, rest_framework/api.htmlsebenarnya hilang pada sistem file karena instalasi yang rusak atau alasan lain yang tidak diketahui. Menginstal ulang djangorestframeworkmemperbaiki masalah:

$ pip install --upgrade djangorestframework

1
Hal yang sama terjadi pada saya. Perhatikan bahwa perintah akan meningkatkan ke versi yang mungkin tidak kompatibel (meskipun setup.py dan / atau requirement.txt Anda mengatakan sebaliknya). Anda dapat mencoba pip uninstall / install atau tentukan versi yang tepat.
Jorge Vargas

5

Harap perhatikan bahwa DRF mencoba mengembalikan data dalam format yang sama dengan yang diminta. Dari browser Anda, ini kemungkinan besar adalah HTML. Untuk menentukan respons alternatif, gunakan ?format=parameter. Sebagai contoh: ?format=json.

The TemplateDoesNotExistkesalahan terjadi paling sering ketika Anda mengunjungi titik akhir API di browser Anda dan Anda tidak memiliki rest_frameworktermasuk dalam daftar aplikasi yang terpasang, seperti yang dijelaskan oleh responden lainnya.

Jika Anda tidak memiliki DRF yang disertakan dalam daftar aplikasi Anda, tetapi tidak ingin menggunakan halaman DRF Admin HTML, coba gunakan format alternatif untuk 'menyampingkan' pesan kesalahan ini.

Info lebih lanjut dari dokumen di sini: http://www.django-rest-framework.org/topics/browsable-api/#formats


4

Bukan kasus Anda, tetapi juga kemungkinan alasan disesuaikan loadersuntuk Django. Misalnya, jika Anda memiliki pengaturan (sejak 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 tidak akan mencoba untuk melihat aplikasi folder dengan template, karena Anda harus secara eksplisit menambahkan django.template.loaders.app_directories.Loaderke dalam loadersuntuk itu.

Perhatikan, bahwa secara default django.template.loaders.app_directories.Loaderdisertakan ke loaders.


PERINGATAN:?: (1_8.W001) Pengaturan TEMPLATE_ * mandiri tidak digunakan lagi di Django 1.8 dan kamus TEMPLATES diutamakan. Anda harus memasukkan nilai dari pengaturan berikut ke default TEMPLATES diktekan: TEMPLATE_DEBUG.
andilabs

0

Saya menemukan pesan kesalahan yang sama. Dalam kasus saya, itu karena pengaturan backend ke Jinja2. Di file pengaturan saya:

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

Mengubah ini kembali ke default memperbaiki masalah:

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

Masih tidak yakin apakah ada cara untuk menggunakan backend Jinja2 dengan rest_framework.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.