フォルダ構造
私は現在、Djangoの本からDjangoを学んでいます。次のディレクトリ構造があります。
.
└── 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
ブック、連絡先、および mysite はフォルダーです。また、これらのフォルダーごとに個別のテンプレート サブフォルダーを用意して、テンプレートを保存します。
話
/mysite/settings.py内に、次の行があります。
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates').replace('\\', '/'),
)
/contact/views.py内に、次の行があります (ここでのレンダリングは django.shortcuts からのものであることに注意してください)。
return render(request, 'contact_form.html', {'form': form})
ただし、上記の行では TemplateDoesNotExist 例外が発生します。これは、テンプレート ローダーがファイル contact_form.html を /contact/templates/ ではなく /mysite/templates/ の下で検索するためです。
なぜそうなのか理解できなくても、十分に公平です。しかし、動作が異なる別のケースがあります。
上記のファイル構造を思い出してください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 は/mysite/templates/フォルダーではなく、 /books/templates/フォルダーの下にありますが、テンプレート ローダーはそれらのファイルを見つけることができました。search_results.html と search_form.html を/mysite/templates/に移動しても機能することに注意してください。
私の質問は、ローダーがテンプレートを探す場所に違いがあるのはなぜですか?
ファイル
とにかく、私の/contact/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', 'noreply@example.com'),
['siteowner@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
print os.path.join(os.path.dirname(__file__), 'templates')
return render(request, 'contact_form.html', {'form': form})
これが私の/books/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})