“admin”子目录触发(无意中)Django管理页面

时间:2013-04-19 18:10:04

标签: python django django-admin

我遇到一些触发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管理站点,其中包含以下消息:“您无权编辑任何内容。”

但是,如果我将“admin”目录更改为“utils”(或其他任何内容,然后是“admin”)并相应地更新我的views.py,则所有内容都会按预期显示!这没关系,我可以处理我的名为“utils”的目录,但它会让我烦恼......就够了。

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

1 个答案:

答案 0 :(得分: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。

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

lobbyVisitorLog
  - templates
    - lobbyVisitorLog
      - admin
        - index.html

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

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

您可以找到有关Django如何加载模板here

的更多信息