导入 django.contrib.auth.urls 不能很好地与现有的管理模板一起使用
Importing django.contrib.auth.urls does not play well with existing admin templates
我一直在尝试遵循 documentation 对 Django (1.9) 站点上的 login/logout 非工作人员用户使用内置 Django 模板。特别是,我通过添加
修改了 urlconf
url('^', include('django.contrib.auth.urls'))
它引入了 /login 和 /logout 端点以及带有预编程默认模板名称的视图。
登录和注销的默认模板名称是registration/login.html
和registration/logged_out.html
。第一个在任何地方都不存在,所以我假设我应该创建一个 templates/registration/
并创建登录模板,我确实这样做了。我认为同样的事情也适用于注销,但事实并非如此。
实际发生的是模板解析为 django.contrib.admin.templates.registration.logged_out.html
。这很漂亮但是很臭,因为登录名 link 指向管理员登录名,非员工用户将无法使用。
我真的希望我可以使用上面的 urlconf,使用默认的模板名称,但编写我自己的模板。这不可能吗?替代方案似乎是在重复一堆东西,这不是很 Pythonic。
我想这可能涉及修改 TEMPLATES
设置,或更改设置中其他内容的顺序。
无论解决方案是什么,我希望它不会干扰管理模板的正确解析(即,如果那些开始使用我的新模板,那将是糟糕的。)
请求的详细信息:
我在 (appname)/templates/registration/
中创建了一个 login.html
,访问登录 url 时它工作正常。
我也在 (appname)/templates/registration/
中创建了一个 logged_out.html
,但发现在访问注销 url 时,我得到了管理站点 logged_out 模板(上面写着"Thanks for spending some quality time with the Web site today."
我的模板设置:
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 "Getting started with python" 应用程序开始改编的。
更新
我终于在 Django 错误跟踪器中找到了正确的搜索词,发现那是 a known issue。令人失望的是,它已经三年了,在过去的两年里没有任何评论。我想我只能硬着头皮定义我自己的 urls,它们在不同的路径上使用模板。
Django 的模板查找是按照 INSTALLED_APPS
的顺序自上而下完成的。这意味着如果你想覆盖一个模板,覆盖的模板应用程序应该列在管理中被覆盖的应用程序之上。
在这种情况下,project.app
应放在 django.contrib.admin
之上,因此在创建 /registration/logout.html
时,它将在管理模板之前加载。
一般来说,推荐的应用安装顺序是:项目-> 3rd 方应用-> django builtins。它还会影响静态文件查找器。
由于 bug in Django,覆盖 registration/logged_out.html
模板也会覆盖管理员 "logged_out" 模板。
您可以专门包含注销视图并指定不同的 "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
。
如果你想在注销后将用户重定向回主页,我会使用第一个选项,如果你想显示 "logged out" 消息,我会使用第二个选项。
我一直在尝试遵循 documentation 对 Django (1.9) 站点上的 login/logout 非工作人员用户使用内置 Django 模板。特别是,我通过添加
修改了 urlconfurl('^', include('django.contrib.auth.urls'))
它引入了 /login 和 /logout 端点以及带有预编程默认模板名称的视图。
登录和注销的默认模板名称是registration/login.html
和registration/logged_out.html
。第一个在任何地方都不存在,所以我假设我应该创建一个 templates/registration/
并创建登录模板,我确实这样做了。我认为同样的事情也适用于注销,但事实并非如此。
实际发生的是模板解析为 django.contrib.admin.templates.registration.logged_out.html
。这很漂亮但是很臭,因为登录名 link 指向管理员登录名,非员工用户将无法使用。
我真的希望我可以使用上面的 urlconf,使用默认的模板名称,但编写我自己的模板。这不可能吗?替代方案似乎是在重复一堆东西,这不是很 Pythonic。
我想这可能涉及修改 TEMPLATES
设置,或更改设置中其他内容的顺序。
无论解决方案是什么,我希望它不会干扰管理模板的正确解析(即,如果那些开始使用我的新模板,那将是糟糕的。)
请求的详细信息:
我在 (appname)/templates/registration/
中创建了一个 login.html
,访问登录 url 时它工作正常。
我也在 (appname)/templates/registration/
中创建了一个 logged_out.html
,但发现在访问注销 url 时,我得到了管理站点 logged_out 模板(上面写着"Thanks for spending some quality time with the Web site today."
我的模板设置:
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 "Getting started with python" 应用程序开始改编的。
更新
我终于在 Django 错误跟踪器中找到了正确的搜索词,发现那是 a known issue。令人失望的是,它已经三年了,在过去的两年里没有任何评论。我想我只能硬着头皮定义我自己的 urls,它们在不同的路径上使用模板。
Django 的模板查找是按照 INSTALLED_APPS
的顺序自上而下完成的。这意味着如果你想覆盖一个模板,覆盖的模板应用程序应该列在管理中被覆盖的应用程序之上。
在这种情况下,project.app
应放在 django.contrib.admin
之上,因此在创建 /registration/logout.html
时,它将在管理模板之前加载。
一般来说,推荐的应用安装顺序是:项目-> 3rd 方应用-> django builtins。它还会影响静态文件查找器。
由于 bug in Django,覆盖 registration/logged_out.html
模板也会覆盖管理员 "logged_out" 模板。
您可以专门包含注销视图并指定不同的 "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
。
如果你想在注销后将用户重定向回主页,我会使用第一个选项,如果你想显示 "logged out" 消息,我会使用第二个选项。