【问题标题】:Django template loader behavior? (got Django TemplateDoesNotExist exception)Django模板加载器行为? (得到 Django TemplateDoesNotExist 异常)
【发布时间】:2012-07-03 04:57:04
【问题描述】:

文件夹结构

我目前正在从 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

books、contact 和 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 异常。这是因为模板加载器在 /mysite/templates/ 下查找文件 contact_form.html 而不是 /contact/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 位于 /books/templates/ 文件夹下,而不是 /mysite/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})

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    由于您显然确实安装了应用程序目录模板加载器,并且由于它适用于您的 books 应用程序,因此我只能得出结论,您在 settings.INSTALLED_APPS 中没有 contact

    【讨论】:

    • 这很快。 :) 是的,这就是问题所在。不过,我仍然不明白 INSTALLED_APPS 的作用。当 10 分钟限制结束时,我会接受你的回答。
    • 嗯,你会期望某种明确的 python 模块列表通过 django 框架运行(与随机 python 脚本、目录中的所有文件、一些命名前缀系统等相反。明确优于隐含的)。 PS:+1 非常详细的问题。
    猜你喜欢
    • 2012-05-26
    • 2015-06-13
    • 2023-03-04
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2014-02-28
    相关资源
    最近更新 更多