添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I am new to Django and just follow the Django official document, but here is a problem.

I create a new Django project with

Django 1.8.2 + PyCharm 4.5.1 + Python 3.4.3 + Windows 8.1

  - mysite
     - main
        - migrations
            __init__.py
        __init__.py
        admin.py
        models.py
        tests.py
        views.py
     - mysite
        __init__.py
        settings.py
        urls.py
        wsgi.py
     - templates
        hello.html
     db.sqlite3
     manage.py

most of these are created automatically, which i modified are as follows:

templates/hello.html

<!DOCTYPE html>
<head lang="en">
  <meta charset="UTF-8">
  <title>Django test</title>
</head>
hello world!
</body>
</html>

mysite/urls.py

from django.conf.urls import include, url
from django.contrib import admin
from main.views import hello
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^hello/$', hello),

main/views.py

from django.shortcuts import render_to_response
def hello(request):
    return render_to_response('hello.html', locals())

and click run and visit localhost:8080, here are results:

TemplateDoesNotExist at /hello/
hello.html
Request Method: GET
Request URL:    http://127.0.0.1:8000/hello/
Django Version: 1.8.2
Exception Type: TemplateDoesNotExist
Exception Value:    
hello.html
Exception Location: C:\Python34\lib\site-packages\django\template\loader.py in get_template, line 46
Python Executable:  C:\Python34\python.exe
Python Version: 3.4.3
Python Path:    
['C:\\Users\\kant\\Desktop\\code\\PycharmProjects\\mysite',
 'C:\\Users\\kant\\Desktop\\code\\PycharmProjects\\mysite',
 'C:\\Windows\\SYSTEM32\\python34.zip',
 'C:\\Python34\\DLLs',
 'C:\\Python34\\lib',
 'C:\\Python34',
 'C:\\Python34\\lib\\site-packages']

if I change the views.py as

from django.http import HttpResponse
def hello(request):
    return HttpResponse("hello world")

it runs correctly.

I think it may caused by the template path, here is the settings.py, generated automatically without modification:

Django settings for mysite project. Generated by 'django-admin startproject' using Django 1.8.2. For more information on this file, see https://docs.djangoproject.com/en/1.8/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.8/ref/settings/ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'p(fs&6e2kg6d3%0txc+9o=(!*8fzt8w5l6neuqer*m9qictsl$' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'main', MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', ROOT_URLCONF = 'mysite.urls' TEMPLATES = [ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, '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', WSGI_APPLICATION = 'mysite.wsgi.application' # Database # https://docs.djangoproject.com/en/1.8/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # Internationalization # https://docs.djangoproject.com/en/1.8/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.8/howto/static-files/ STATIC_URL = '/static/' TEMPLATE_DIRS = ( os.path.join(BASE_DIR, 'templates'),

This is how you set up template directories in Django 1.7.x and below. In Django 1.8.x, change your TEMPLATES [] to read like this:

TEMPLATES = [
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
        'APP_DIRS': True,
        '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',

Thank you for being so thorough with your question. Good luck!

If you want to access templates inside <project>/templates then you have to specify DIRS inside TEMPLATES

TEMPLATES = [
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'),],
        'APP_DIRS': True,
        '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',
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, ''),

views.py
return render(request, "", {})
example :
return render(request, "pages/template/home.html", {})

Much easier solution inside your template folder make another folder and name it your app name so your file tree should look something like this:

 - mysite
 - main
    - migrations
        __init__.py
    __init__.py
    admin.py
    models.py
    tests.py
    views.py
 - mysite
    __init__.py
    settings.py
    urls.py
    wsgi.py
 - templates
   -mysite
       hello.html
 db.sqlite3
 manage.py

I had the same error but didn't know what is causing it.. I realized I had not added my app to the list of Django installed apps list. Prevously it was as:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

And now I have added my app then it looks like

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'main',
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
        os.path.join( BASE_DIR ,'projectname/templates/')
        ],`enter code here`
    'APP_DIRS': True,
    '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',
from django.conf.urls import include, url
from django.contrib import admin
from main.views import hello # this is the error
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^hello/$', hello), # bad bad bad

you have to import urls.py of your app main and you are import views

change your code like this

urls.py #in folder mysite/

from django.conf.urls import path, include, url
from django.contrib import admin
from . import views ##add this line
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url('main/', include(main.urls), name='main'), ## add this line

you have to create a new file in your app main named urls.py #in folder main/

from django.urls.conf import path
from . import views
app_name = 'main'
urlpatterns = [
    path('', views.hello, name="hello"),

the last file you created in the main folder say to your project to have urls on main app

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.