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

rsc*_*ieb 4 django django-templates django-admin django-login

我一直在尝试遵循有关使用内置 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,使用默认模板名称,但编写我自己的模板。这不可能吗?另一种选择似乎是重复一堆东西,这不太符合 Python 风格。

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

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


要求的详细信息:

我创建了一个login.htmlin (appname)/templates/registration/,在访问登录网址时它工作得很好。

我还创建了一个logged_out.htmlin (appname)/templates/registration/,但发现在访问注销 url 时,我得到了管理站点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'
)
Run Code Online (Sandbox Code Playgroud)

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

project/
    app/
        templates/
            app/
            registration/
                login.html
                logged_out.html
        models.py
        views.py
        admin.py
    gettingstarted/
        static/
        settings.py
        urls.py
Run Code Online (Sandbox Code Playgroud)

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

更新

我终于在 Django bug 跟踪器中找到了正确的搜索词,并发现这是一个已知问题。令人失望的是,它已经三年了,在过去的两年里没有任何评论。我想我只需要硬着头皮定义自己的网址,在不同的路径上使用模板。

ypr*_*rez 6

Django 的模板查找是按照INSTALLED_APPS. 这意味着,如果您想覆盖模板,则覆盖模板应用程序应列在管理中被覆盖模板应用程序的上方。

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

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


由于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')),
]
Run Code Online (Sandbox Code Playgroud)

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

或者要更改logged_out模板位置,请使用:

url(r'^logout/$', auth_views.logout, {'template_name': 'logged_out.html'}, name='logout'),
Run Code Online (Sandbox Code Playgroud)

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

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