2012-07-02 4 views
2

폴더 구조장고 템플릿 로더 동작? (가지고 장고 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}) 

답변

6

당신은 분명히 앱 디렉토리 템플릿 로더를 가지고 있기 때문에 설치되어 있고 books 앱에서 작동하므로 contactsettings.INSTALLED_APPS에없는 것으로 결론 지을 수 있습니다.

+0

빠른 답변입니다. :) 그리고 네, 그게 문제였습니다. 그래도 INSTALLED_APPS가하는 일을 이해하지 못합니다. 10 분이 지났을 때 답을 수락합니다. –

+0

글쎄, 당신은 django 프레임 워크 (임의의 파이썬 스크립트, 디렉토리의 모든 파일, 네이밍 접두어 시스템 등등과 달리 명시 적으로 일종의 목록을 일종의 장고 프레임 워크를 통해 기대할 수 있습니다. 명시 적으로 묵시적보다 낫다.) 추신 : 매우 상세한 질문은 +1. –