Импорт модуля Python внутри пользовательских тегов-шаблонов Django - PullRequest
0 голосов
/ 16 марта 2011

Я использую virtualenv с моей установкой Python Django.

Вот моя структура каталогов :

project/
    dev_environ/
        lib/
            python2.6/
                site-packages/
                    ...
                    django/
                    titlecase/   # <-- The titlecase module
                    PIL/
                    ...
        bin/
            ...
            python  # <-- Python
            ...
        include/

    django_project/
        localsite/
            templatetags/
                __init__.py
                smarttitle.py    # <-- My templatetag module
        foo_app/
        bar_app/
        settings.py
        manage.py

Если я запускаю свою оболочку Django ипопытка импортировать titlecase все в порядке, потому что titlecase находится в sys.path в dev_environ/lib/python2.6/site-packages/titlecase.

$:django_project cwilcox$ ../dev_environ/bin/python manage.py shell
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import titlecase  # <-- No Import Error!
>>> 

Я даже могу сделать import titlecase внутри моего settings.py файла без ошибок.

Однако, когда я пытаюсь import titlecase в моей библиотеке тегов smarttitle.py, я получаю ImportError.

smarttitle.py выглядит следующим образом.

from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
from titlecase import titlecase as _to_titlecase

@register.filter
@stringfilter
def smarttitle(value):
    return _to_titlecase(value)
smarttitle.is_safe = True

Не только это, но я могу даже import titlecase внутри представления, которое отображает шаблон, который пытается {% load smarttitle %} и ошибки нет.

Мой сервер разработки Django запущен с ...

../dev_environ/bin/python manage.py runserver

В заключение:

Я могу импортироватьtitlecase модуль везде кроме как внутри этой библиотеки тегов-шаблонов, где он выдает ImportError!Что дает?!Есть идеи?


РЕДАКТИРОВАТЬ : Сначала я попытался запустить source dev_environ/bin/activate, чтобы переключить мою оболочку env на virtualenv, но это не помогло - я все еще получаюImportError внутри моего модуля tagtag.Я уже вызывал правильный двоичный файл Python вручную.

Ответы [ 3 ]

2 голосов
/ 05 мая 2015

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

Проблема, похоже, в , использующей одно и то же имя для приложения и модуля , поэтому, когдапопытка импорта может привести к сбою при поиске нужного модуля или функции в неправильном месте.

Я рекомендую дать различным именам приложению или модулю django.

2 голосов
/ 17 марта 2011

Как указано в комментариях, вам нужно активировать virtualenv, выполнив source bin/activate (или просто . bin/activate) перед запуском devserver, даже если вы уже обращаетесь к нужному исполняемому файлу Python.

0 голосов
/ 06 марта 2012

Это не исправление, а просто подтверждение того, что мы рассматриваем ту же проблему / ошибку:

Если вы измените импорт в smarttitle.py на

from YOURPROJECT.titlecase import titlecase as _to_titlecase

, то этобудет работать с 'runserver', но он не будет работать (в моем случае uwsgi / nginx)

...