TemplateDoesNotExist - Lỗi Django


116

Tôi đang sử dụng Django Rest Framework. và tôi tiếp tục gặp lỗi

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

Tôi không biết mình sẽ sai như thế nào. Đây là lần đầu tiên tôi dùng thử REST Framework. Đây là mã.

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

from django.forms nhập widget từ rest_framework nhập serializers từ 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
Bạn có "rest_framework" được liệt kê trong settings.py INSTALLED_APPS của mình không?
Scott Woodall

Sai lầm lớn nhất. Cảm ơn cho nó.
python-coder

Tôi nghi ngờ khác. Làm cách nào để lấy biểu mẫu trong biểu mẫu này để tôi đăng một số dữ liệu trong biểu mẫu, nhấn DB với các giá trị đó và nhận kết quả? How do I get the form?
python-coder

@ScottWoodall vui lòng đăng câu trả lời và nhận được một số điểm!
Udi

Câu trả lời:


283

Hãy chắc chắn rằng bạn đã rest_frameworkliệt kê trong của bạn settings.py INSTALLED_APPS.


Cũng có thể là do không đăng ký phần phụ thuộc của DRF. Trong trường hợp của tôi, tôi đã phải thêm 'django_hstore',vào INSTALLED_APPS.
shacker,

5

Đối với tôi, rest_framework/api.htmlthực sự bị thiếu trên hệ thống tệp do cài đặt bị hỏng hoặc một số lý do không xác định khác. Cài đặt lại đã djangorestframeworkkhắc phục sự cố:

$ pip install --upgrade djangorestframework

1
Điều tương tự đã xảy ra với tôi. Lưu ý rằng lệnh sẽ nâng cấp lên một phiên bản có thể không tương thích (ngay cả khi setup.py và / hoặc tests.txt của bạn nói khác). Bạn có thể thử gỡ cài đặt / cài đặt pip hoặc chỉ định phiên bản chính xác.
Jorge Vargas

5

Xin lưu ý rằng DRF cố gắng trả lại dữ liệu ở cùng một định dạng được yêu cầu. Từ trình duyệt của bạn, đây rất có thể là HTML. Để chỉ định một phản hồi thay thế, hãy sử dụng ?format=tham số. Ví dụ: ?format=json.

Các TemplateDoesNotExistlỗi xảy ra phổ biến nhất là khi bạn đang truy cập một endpoint API trong trình duyệt của bạn và bạn khôngrest_frameworktrong danh sách các ứng dụng được cài đặt, như mô tả của người trả lời khác.

Nếu bạn không có DRF trong danh sách ứng dụng của mình, nhưng không muốn sử dụng trang HTML Admin DRF, hãy thử sử dụng định dạng thay thế cho thông báo lỗi này 'side-step'.

Thông tin thêm từ các tài liệu tại đây: http://www.django-rest-framework.org/topics/browsable-api/#formats


4

Không phải trường hợp của bạn, nhưng cũng có thể lý do được tùy chỉnh loaderscho Django. Ví dụ: nếu bạn có trong cài đặt (kể từ 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 sẽ không cố gắng xem xét các thư mục ứng dụng với các mẫu, bởi vì bạn nên thêm django.template.loaders.app_directories.Loadervào loadersđó một cách rõ ràng .

Lưu ý, theo mặc định được django.template.loaders.app_directories.Loaderbao gồm trong loaders.


CẢNH BÁO:?: (1_8.W001) Cài đặt TEMPLATE_ * độc lập không được chấp nhận trong Django 1.8 và từ điển TEMPLATES được ưu tiên. Bạn phải đặt các giá trị của các cài đặt sau vào TEMPLATES dict mặc định của mình: TEMPLATE_DEBUG.
andilabs

0

Tôi gặp phải thông báo lỗi tương tự. Trong trường hợp của tôi, đó là do đặt chương trình phụ trợ thành Jinja2. Trong tệp cài đặt của tôi:

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

Thay đổi điều này trở lại mặc định đã khắc phục sự cố:

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

Vẫn không chắc liệu có cách nào để sử dụng chương trình phụ trợ Jinja2 với rest_framework hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.