폴더 구조장고 템플릿 로더 동작? (가지고 장고 TemplateDoesNotExist 예외)
나는 현재 장고 책에서 장고를 배우고 있습니다. 다음 디렉토리 구조를 가지고 있습니다 :
.
└── mysite
├── books
│ ├── __init__.py
│ ├── models.py
│ ├── templates
│ │ ├── search_form.html
│ │ └── search_results.html
│ ├── tests.py
│ └── views.py
├── contact
│ ├── forms.py
│ ├── __init__.py
│ ├── templates
│ │ └── contact_form.html
│ └── views.py
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── templates
│ ├── base.html
│ ├── current_datetime.html
│ └── hours_ahead.html
├── urls.py
├── views.py
└── wsgi.py
books, contact, mysite는 폴더입니다. 또한 각 폴더에 템플릿을 저장할 별도의 템플릿 하위 폴더가 있습니다. 이제 스토리
, /mysite/settings.py 내부에, 나는 다음과 같은 라인이 있습니다
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates').replace('\\', '/'),
)
/contact/views.py내부를, 나는 다음과 같은 한 line (렌더링은 django.shortcuts에서 온 것임을 유의하십시오.) :
return render(request, 'contact_form.html', {'form': form})
그러나 위의 줄은 나에게 TemplateDoesNotExist 예외를 제공합니다. 이는 템플릿 로더가 /mysite/templates/에서 /contact/templates/ 대신 contact_form.html 파일을 찾기 때문입니다.
비록 내가 왜 그런지 이해하지 못한다고해도 충분히 공정합니다. 그러나, 나는 다르게 행동하는 또 다른 경우가 있습니다.
위의 파일 구조에서 회상 해주십시오. books/views.py
도 있습니다. 그 안에는 내가 (다른 논리 블록) 다음 줄이 : 위에서 다시 보면
return render(request, 'search_results.html',
{'books': books, 'query': q})
및
return render(request, 'search_form.html', {'errors': errors})
을 search_results.html 및 search_form.html 아래에있는 /도서/templates/ 폴더가 아니고 /mysite/templates/ 폴더가 아니며 템플릿 로더가 해당 파일을 찾을 수 있습니다. search_results.html 및 search_form.html을 /mysite/templates/으로 이동해도 여전히 작동합니다.
제 질문은 왜 로더가 템플릿을 찾는 위치가 다른가요?
파일
어쨌든, 여기처럼 내 /contact/views.py 보이는 내용은 다음과 같습니다
from django.shortcuts import render
from django.http import HttpResponse
from books.models import Book
def search(request):
errors = []
if 'q' in request.GET:
q = request.GET['q']
if not q:
errors.append('Enter a search term.')
elif len(q) > 20:
errors.append('Please enter at most 20 characters.')
else:
books = Book.objects.filter(title__icontains=q)
return render(request, 'search_results.html',
{'books': books, 'query': q})
return render(request, 'search_form.html', {'errors': errors})
: 여기 내 /books/views.py의 from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.mail import send_mail
from forms import ContactForm
import os
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(
cd['subject'],
cd['message'],
cd.get('email', '[email protected]'),
['[email protected]'],
)
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
print os.path.join(os.path.dirname(__file__), 'templates')
return render(request, 'contact_form.html', {'form': form})
빠른 답변입니다. :) 그리고 네, 그게 문제였습니다. 그래도 INSTALLED_APPS가하는 일을 이해하지 못합니다. 10 분이 지났을 때 답을 수락합니다. –
글쎄, 당신은 django 프레임 워크 (임의의 파이썬 스크립트, 디렉토리의 모든 파일, 네이밍 접두어 시스템 등등과 달리 명시 적으로 일종의 목록을 일종의 장고 프레임 워크를 통해 기대할 수 있습니다. 명시 적으로 묵시적보다 낫다.) 추신 : 매우 상세한 질문은 +1. –