TemplateDoesNotExist - ข้อผิดพลาด Django


117

ฉันใช้ Django Rest Framework และฉันยังคงได้รับข้อผิดพลาด

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

ฉันไม่รู้ว่าฉันจะทำอะไรผิด นี่เป็นครั้งแรกที่ฉันทดลองใช้ REST Framework นี่คือรหัส

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 นำเข้า serializers จากการนำเข้า module.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

ข้อผิดพลาดที่ไม่สำคัญที่สุด ขอบคุณสำหรับมัน
python-coder

ฉันสงสัยอีกอย่าง ฉันจะรับแบบฟอร์มในสิ่งนี้ได้อย่างไรเพื่อให้ฉันโพสต์ข้อมูลบางส่วนในแบบฟอร์มตี DB ด้วยค่าเหล่านั้นและรับผลลัพธ์ How do I get the form?
python-coder

@ScottWoodall โปรดโพสต์คำตอบและรับคะแนน!
Udi

คำตอบ:


285

ตรวจสอบให้แน่ใจว่าคุณได้rest_frameworkระบุไว้ในsettings.py INSTALLED_APPSไฟล์.


นอกจากนี้ยังอาจเป็นผลมาจากการไม่ลงทะเบียนการพึ่งพา DRF ในกรณีของฉันฉันมีการเพิ่มการ'django_hstore', INSTALLED_APPS
shacker

5

สำหรับฉันrest_framework/api.htmlจริงๆแล้วระบบไฟล์หายไปเนื่องจากการติดตั้งเสียหายหรือสาเหตุอื่น ๆ ที่ไม่ทราบสาเหตุ การติดตั้งใหม่djangorestframeworkแก้ไขปัญหา:

$ pip install --upgrade djangorestframework

1
สิ่งเดียวกันเกิดขึ้นกับฉัน โปรดทราบว่าคำสั่งจะอัปเกรดเป็นเวอร์ชันที่อาจเข้ากันไม่ได้ (แม้ว่า setup.py และ / หรือ requirements.txt ของคุณจะระบุไว้เป็นอย่างอื่นก็ตาม) คุณสามารถลองถอนการติดตั้ง / ติดตั้ง pip หรือระบุเวอร์ชันที่แน่นอนได้
Jorge Vargas

5

โปรดทราบว่า DRF พยายามส่งคืนข้อมูลในรูปแบบเดียวกับที่ร้องขอ จากเบราว์เซอร์ของคุณน่าจะเป็น HTML ในการระบุการตอบกลับอื่นให้ใช้?format=พารามิเตอร์ ตัวอย่างเช่น: ?format=json.

TemplateDoesNotExistข้อผิดพลาดเกิดขึ้นมากที่สุดเมื่อคุณกำลังเยี่ยมชมปลายทาง API ในเบราว์เซอร์ของคุณและคุณไม่ได้rest_frameworkรวมอยู่ในรายชื่อของปพลิเคชันที่ติดตั้งตามที่อธิบายไว้โดยผู้ตอบแบบสอบถามอื่น ๆ

หากคุณไม่มี DRF รวมอยู่ในรายการแอพของคุณ แต่ไม่ต้องการใช้หน้า HTML Admin DRF ให้ลองใช้รูปแบบอื่นในการ 'side-step' ข้อความแสดงข้อผิดพลาดนี้

ข้อมูลเพิ่มเติมจากเอกสารที่นี่: 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.Loaderเข้าไปloadersที่

สังเกตว่าโดยค่าเริ่มต้นdjango.template.loaders.app_directories.Loaderรวมอยู่ในloadersไฟล์.


คำเตือน:?: (1_8.W001) การตั้งค่า TEMPLATE_ * แบบสแตนด์อโลนเลิกใช้แล้วใน Django 1.8 และพจนานุกรม TEMPLATES มีความสำคัญกว่า คุณต้องใส่ค่าของการตั้งค่าต่อไปนี้ลงในคำสั่ง TEMPLATES เริ่มต้นของคุณ: TEMPLATE_DEBUG
andilabs

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.