【问题标题】:Django modify templates of pip-installed appDjango 修改 pip 安装应用的模板
【发布时间】:2014-06-06 06:52:45
【问题描述】:

我想知道为通过 pip 安装的应用程序覆盖模板的正确方法是什么。我的示例与 django-notifications 应用程序有关。结构如下:

notifications
|---- __init__.py
|---- templates
      |---- notifications
            |---- list.html
            |---- notice.html

我在我的应用程序中复制了这个结构并相应地修改了 .html 文件。但是现在我面临以下错误:ImportError: cannot import name notify,当我在另一个应用程序(配置文件)的视图中调用 from notifications import notify 时发生这种情况。

如果不覆盖模板,我不会出错。我错过了什么?我需要在 settings.py 中添加什么其他内容吗?

(我已完全按照包中的 README.md 安装说明进行操作,无需覆盖模板即可正常工作)

引用

File "/projectpath/project/urls.py", line 13, in <module>
  url(r'^profile/', include('profile.urls')),

File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 26, in include
  urlconf_module = import_module(urlconf_module)

File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/utils/importlib.py", line 40, in import_module
  __import__(name)

File "/projectpath/profile/urls.py", line 2, in <module>
  from profile import views

File "/projectpath/profile/views.py", line 17, in <module>
    from notifications import notify

ImportError: cannot import name notify

查看

from notifications import notify

def edit(request):
  ...
  notify.send(request.user, recipient=request.user, verb='you reached level 10')

设置

# Project directory root assuming: yunite.settings.base
PROJECT_DIR = Path(__file__).ancestor(3)

#ROOT_PATH = os.path.dirname(__file__)


TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)


TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.request",
    "django.contrib.auth.context_processors.auth",
)


# Directory to find templates
TEMPLATE_DIRS = (
    PROJECT_DIR.child("templates"),
)


INSTALLED_APPS = (
    ...
    'notifications',
)

【问题讨论】:

  • 您解决了吗?我也被困在这一点上。烦人的部分是我编写了一个名为notifications 的自定义应用程序。现在想来,好像app名本身有什么东西。
  • 奇怪的是,在使用除notifications 以外的其他名称重组应用程序后,它工作得很好。这很奇怪!

标签: python django notifications django-templates django-notification


【解决方案1】:

在 Django 中覆盖模板很简单。在您的主应用程序目录中,必须有一个模板目录(如果还没有,则创建)。然后在模板目录中创建一个新目录,在您的情况下命名为(通知)。然后根据您的情况在此处复制模板文件(list.htmlnotice.html)。

完成后,您已使用自己的模板覆盖了应用模板。随意编辑它们。

【讨论】:

  • 嗯,是的,这应该很容易,这就是我首先要做的,但是这里发生了一些未知的事情,这使它变得更加困难
  • 老实说,我不认为这是来自您的回溯模板的问题。您介意分享您使用通知应用程序的设置文件和应用程序代码吗?
  • 已发布。不确定您是否想在设置中查看其他内容
  • 好的,这里有一个简单的调试方法。首先做一个pip freeze,看看你是否真的在项目的virtualenv中安装了应用程序。接下来,打开python manage.py shell 并尝试导入通知。此外,如果您还没有使用 ipython,请执行此操作。它对使用自动完成功能进行调试非常有帮助。
  • pip freeze 显示:django-notifications-hq==0.6.0python manage.py shell showsImportError: cannot import name notify。不幸的是没有帮助
【解决方案2】:

抱歉问:您是否在 INSTALLED_APPS 中添加了“通知”?这听起来像被覆盖的模板只是使导入错误可见。

【讨论】:

  • 是的,它已经被添加了。如果我不覆盖模板,则没有导入错误,一切正常
  • 模板中没有导入。您可以检查回溯以查看有问题的代码是如何被调用的。我很确定模板只是让其他地方出现的问题可见。
  • 我已经包含了引用
  • 回溯中没有对模板的提示。当您知道为什么views.py 无法从通知中导入时,您将获得解决方案。另一个随机的想法:是否有任何名为“notifications”的文件夹被views.py视为一个模块?
  • 我在通知目录中有一个 init.py 文件。没有这个,它运行完美,但不会覆盖模板
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2016-01-03
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多