TemplateDoesNotExist на python app-engine django 1.2, в то время как шаблон отображает абсолютные пути - PullRequest
0 голосов
/ 08 сентября 2011

Из-за предупреждения App Engine

Вы используете версию Django по умолчанию (0.96). Версия Django по умолчанию изменится в версии App Engine в ближайшем будущем. Пожалуйста, вызовите use_library (), чтобы явно выбрать версию Django. Для получения дополнительной информации см http://code.google.com/appengine/docs/python/tools/libraries.html#Django

Я добавил две строки кода в начало main.py

from google.appengine.dist import use_library
use_library("django", "1.2")

Этот код полностью сломал мое приложение, подняв эту ошибку

File "/home/adel/Software/google_appengine/lib/django_1_2/django/template/loader.py", line 138, in find_template
raise TemplateDoesNotExist(name)
TemplateDoesNotExist: /home/adel/Workspace/jeeneo/site/Common/templates/en_US/template.html

Я занимался поиском и нашел разработчиков с похожей проблемой относительного пути, который больше не поддерживается в Django, в моем случае я использовал абсолютный путь, и мой код структурирован таким образом

site/
    Frontpage/
        template/en_US/index.html
        index.py
    Events/
        template/en_US/event.html
        template/en_US/create.html
        event.py
        create.py
    Common/
        template/en_US/template.html
        template.py

Каждому классу свойственен шаблон класса, подобный этому

from Common import Template
class Event(Template):
    def get(self):

Тогда звоните

self.render(__file__, "event.html")

Для рендеринга HTML-файла, функция рендеринга имеет это внутри

def render(self, path, html):
    self.base = self.get_base()
    email = None
    if self.user:
        self.auth_url = users.create_logout_url("/")
        email = self.user.email
    else:
        self.auth_url = users.create_login_url(self.request.uri)

    self.template.update({
        "base": self.base,
        "user": self.user,
        "lang": self.lang,
        "template_html" : os.path.join(os.path.dirname(__file__), "templates/%s/template.html" % self.lang),
        "email": email,
        "auth_url": self.auth_url
    })

    html = os.path.join(os.path.dirname(path), "templates/%s/%s" % (self.lang, html))
    self.template.update(self.data)
    self.response.out.write(template.render(html, self.template))

И HTML-файл (event.html) имеет этот код

{% extends template_html %}

У меня на уме два решения, возможно, реструктурировать все и сделать все шаблоны в одной папке, или у меня локальная установка Django 0.96 на App Engine ... но я уверен, что должно быть более простое решение.

1 Ответ

1 голос
/ 09 сентября 2011

У меня были некоторые похожие проблемы, с некоторыми исправлениями, которые я описал здесь:

Изменение версии Django по умолчанию для движка приложения

Когда вы используете template.render движка приложения, оноустанавливает TEMPLATE_DIRS в каталог шаблона, который вы отображаете.Тег extends в Django 1.2 проверяет, что включенные шаблоны находятся внутри каталога TEMPLATE_DIRS.Если они находятся в родительском (или родственном) каталоге, то это не сработает.

Решение, которое я нашел, состояло в том, чтобы не использовать template.render движка приложения, а вместо этого написать свой собственный, используя класс Template Django.Затем мне также пришлось установить TEMPLATE_DIRS в корневой каталог моего проекта.

Это происходит из моей памяти о том, как это было в 1.4.2, когда я впервые посмотрел на это - поведение могло изменитьсяс тех пор (хотя мои обходные пути все еще работают нормально).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...