【问题标题】:"admin" Subdirectory Triggering (unintentially) Django Admin Pages“admin”子目录触发(无意)Django Admin Pages
【发布时间】:2013-04-13 05:19:05
【问题描述】:

我在某些自定义管理页面触发 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 管理页面而不是我的自定义页面?

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    默认情况下,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”而破坏管理站点。 html'来自您的应用程序,lobbyVisitorLog。

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

    lobbyVisitorLog
      - templates
        - lobbyVisitorLog
          - admin
            - index.html
    

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

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

    您可以找到更多关于 Django 如何加载模板here

    【讨论】:

    • 我添加了一个关于 URL 的部分(它们也不正确)。随意编辑或删除它。认为在这个答案中添加额外内容比创建一个新答案更好。你可能不同意。
    • 我相信他的网址是正确的。 lobbyVisitorLog/urls.py 中的 url 包含在 ^visitorLog 模式上的主 urls.py 中(在将 /visitorLog 片段传递给 lobbyVisitorLog/urls.py 之前匹配并删除它),因此它只会匹配 domain.com/访客日志/管理员/
    • 你是对的 - 教我在为他人的答案做出贡献时不进行验证。对不起,我怪星期天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2017-09-03
    • 2018-04-28
    相关资源
    最近更新 更多