3

我在某些自定义管理页面触发 Django 管理站点而不是显示我的自定义页面时遇到问题。

我的urls.py如下:

urlpatterns = patterns('',
    # ... trimmed ...

    # Admin pages
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),                       
    url(r'^admin/', include(admin.site.urls)),

    # Lobby Visitor Log
    url(r'^visitorLog', include('lobbyVisitorLog.urls')),
)

在我的lobbyVisitorLog应用程序中,我有以下目录结构,导致“管理”页面

lobbyVisitorLog
  - templates
      - admin

我的lobbyVisitorLog/urls.py如下:

urlpatterns = patterns('visitorLog.views',
    url(r'^/$', views.home, name='homeView'),
    url(r'^/search', views.search, name='searchView'),
    url(r'^/submit', views.submit, name='submitView'),

    url(r'^/admin/$', views.adminView, name='adminView'),
    url(r'^/admin/import/$', views.adminImportView, name='adminImportView'),

    url(r'^/(?P<guest_type>\w+)$', views.logEntry, name='logEntryView'),
)

管理索引页面的views.py如下所示:

def adminView(request):
    return render(request, 'admin/index.html', {}, context_instance=RequestContext(request))

当我转到“mysite/visitorLog/admin/”时,我会看到带有以下消息的 Django 管理站点:“您无权编辑任何内容。”</p>

但是,如果我将“admin”目录更改为“utils”(或除“admin”之外的其他任何目录)并相应地更新我的目录views.py,一切都会按预期显示!这没关系,我可以处理我的目录被称为“utils”,但它会惹恼我......就够了。

发生了什么导致 Django 管理页面加载而不是我的自定义页面?

4

1 回答 1

2

默认情况下,django 首先检查您在TEMPLATE_DIRS“admin/index.html”中的每个路径。如果在那里找不到它,它会开始在模板目录中搜索INSTALLED_APPS设置中的每个应用程序。

如果'django.contrib.admin'在 中列出INSTALLED_APPS,它将使用 django.contrib.admin 应用程序中同名的 'admin/index.html' 模板。

移到'django.contrib.admin'最后一个位置INSTALLED_APPS应该允许它首先在您的 lobbyVisitorLog 应用程序中找到“admin/index.html”,但这会破坏管理站点,因为它会使用您的应用程序大堂访问日志中的“admin/index.html”。

解决此问题的一个好方法是在应用的模板目录中始终有一个以应用命名的子目录。例如:

lobbyVisitorLog
  - templates
    - lobbyVisitorLog
      - admin
        - index.html

然后更新视图的模板路径:

def adminView(request):
    return render(request, 'lobbyVisitorLog/admin/index.html', {}, context_instance=RequestContext(request))

您可以在此处找到有关 Django 如何加载模板的更多信息

于 2013-04-19T19:41:23.343 回答