2

フォルダ構造

私は現在、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})
4

1 に答える 1

6

どうやらアプリディレクトリテンプレートローダーがインストールされているようで、booksアプリで動作するためcontactsettings.INSTALLED_APPS.

于 2012-07-02T18:50:55.887 に答える