导入 django.contrib.auth.urls 不能很好地与现有的管理模板配合使用

Posted

技术标签:

【中文标题】导入 django.contrib.auth.urls 不能很好地与现有的管理模板配合使用【英文标题】:Importing django.contrib.auth.urls does not play well with existing admin templates 【发布时间】:2016-06-18 16:33:53 【问题描述】:

我一直在尝试关注documentation 使用内置 Django 模板登录/注销 Django (1.9) 站点上的非员工用户。特别是,我通过添加

修改了 urlconf

url('^', include('django.contrib.auth.urls'))

它引入了 /login 和 /logout 端点以及带有预编程默认模板名称的视图。

登录和注销的默认模板名称是registration/login.htmlregistration/logged_out.html。第一个在任何地方都不存在,所以我假设我应该创建一个templates/registration/ 并创建登录模板,我这样做了。我认为同样的事情应该适用于注销,但它没有。

实际发生的是模板解析为django.contrib.admin.templates.registration.logged_out.html。这很漂亮,但很臭,因为登录链接指向管理员登录,非员工用户将无法使用。

我真的希望我可以使用上面的 urlconf,使用默认的模板名称,但编写我自己的模板。这不可能吗?替代方案似乎是重复一堆东西,这不是很 Pythonic。

我想这可能涉及修改 TEMPLATES 设置,或更改设置中其他内容的顺序。

无论解决方案是什么,我希望它不会干扰管理模板的正确解析(即,如果那些开始使用我的新模板会很糟糕。)


要求的详细信息:

我在(appname)/templates/registration/ 中创建了一个login.html,在访问登录网址时效果很好。

我还在(appname)/templates/registration/ 中创建了一个logged_out.html,但发现在访问注销网址时,我得到了管理站点logged_out 模板(上面写着“感谢您今天在网站上度过了美好的时光。”

我的模板设置:

TEMPLATES = [
    
         'BACKEND': 'django.template.backends.django.DjangoTemplates',
         'DIRS': [],
         'APP_DIRS': True,
         'OPTIONS': 
             'debug': True,
             'context_processors': [
                 'django.template.context_processors.debug',
                 'django.template.context_processors.request',
                 'django.contrib.auth.context_processors.auth',
                 'django.contrib.messages.context_processors.messages',
             ],
         ,
    ,
]

INSTALLED_APPS = (
    'django.contrib.admin',
    'app',
    'django.contrib.auth',
    'django.contrib.contenttypes', 
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles'
)

项目结构(省略我认为无关紧要的内容,并使用一些通用名称。)

project/
    app/
        templates/
            app/
            registration/
                login.html
                logged_out.html
        models.py
        views.py
        admin.py
    gettingstarted/
        static/
        settings.py
        urls.py

结构可能看起来有点奇怪,因为它是从 Heroku“Python 入门”应用程序开始改编的。

更新

我终于在 Django 错误跟踪器中找到了正确的搜索词,发现是 a known issue。令人失望的是它已经三年了,在过去的两年里没有任何评论。我想我只能硬着头皮定义自己的 url,这些 url 在不同的路径上使用模板。

【问题讨论】:

在模板文件夹中创建registration/logged_out.htmlregistration/login.html 是正确的做法。 logged_out.html 应该以与 login.html 相同的方式工作。一种对你有用,而另一种对你有用吗?您可以发布您的项目和模板文件夹结构以及您的TEMPLATES 设置吗? @yprez 感谢您的回复,并对延迟回复表示歉意。我已尝试添加您要求的信息。让我知道还有什么要补充的。 settings.pyINSTALLED_APPS 设置中,您的应用程序(project.app) 是在'django.contrib.auth' 之前还是之后?它应该出现在模板之前,以便正确重载...... @yprez 感谢您的想法,但我有坏消息。我的应用比django.contrib.auth 晚了很多,所以我把它移到了django.contrib.auth 之前。但是,所有的症状还是和以前一样:我的模板没有被使用。 覆盖login.html 是否正常工作? 【参考方案1】:

Django 的模板查找是按照INSTALLED_APPS 的顺序自上而下完成的。这意味着如果您要覆盖模板,则应在管理员中将覆盖模板应用程序列在被覆盖的应用程序上方。

在这种情况下,project.app 应该放在 django.contrib.admin 上方,因此在创建 /registration/logout.html 时,它将在管理模板之前加载。

一般来说,推荐的安装应用顺序是:项目 -> 3rd party apps -> django builtins。它还会影响静态文件查找器。


由于bug in Django,覆盖registration/logged_out.html 模板也会覆盖管理员“logged_out”模板。

您可以专门包含注销视图并指定不同的“注销”模板或next_page(注销后重定向的视图):

from django.contrib.auth import views as auth_views

urlpatterns = [
    url(r'^logout/$', auth_views.logout, 'next_page': '/', name='logout'),
    url('^', include('django.contrib.auth.urls')),
]

这将在注销后重定向到/。它也可以是一个命名的 url。

或更改logged_out 模板位置使用:

url(r'^logout/$', auth_views.logout, 'template_name': 'logged_out.html', name='logout'),

然后在project/app/templates/中创建logged_out.html

如果您想在注销后将用户重定向回主页,我会使用第一个选项,如果您想显示“注销”消息,我会使用第二个选项。

【讨论】:

谢谢:这很有帮助。 如果我想保留管理员注销页面,同时将我的应用程序放在已安装应用程序的顶部怎么办?如何让 django 识别我的 /registration 目录和管理员 /registration 之间的区别? 不能,第一个匹配名字的会被返回。唯一的解决方案是给您的模板一个不同的名称(文件名或路径),例如custom_logged_out.html 而不是 registration/logged_out.html 我害怕那个。我已经这样做了,一切正常。有没有计划解决这个错误? :) 这个错误有点挑战,因为它是一个重大的变化,不知道如何处理......

以上是关于导入 django.contrib.auth.urls 不能很好地与现有的管理模板配合使用的主要内容,如果未能解决你的问题,请参考以下文章

Axure RP文件导入导出方法

Python导入模块问题

POI 实现导入Excel 导入问题

模块导入循环导入模块查找顺序相对导入及绝对导入

如何导入excel并存入数据库

sql如何导入数据库