导入django.contrib.auth.urls与现有管理模板不兼容

时间:2016-03-04 19:30:54

标签: django django-templates django-admin django-login

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

修改了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,使用默认模板名称,但是编写我自己的模板。这不可能吗?替代方案似乎重复了一堆东西,而且不是很恐怖。

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

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

请求的详细信息:

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

我在logged_out.html中也创建了(appname)/templates/registration/,但发现在访问注销网址时,我获得了管理网站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 bug跟踪器中找到了正确的搜索词,发现它是a known issue。令人失望的是,它已经三年了,过去两年没有评论。我想我只需要咬紧牙关并定义我自己的网址,这些网址在不同的路径上使用模板。

1 个答案:

答案 0 :(得分:2)

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

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

通常,已安装应用的推荐顺序为:project - >第三方应用 - > django builtins。它还会影响静态文件查找器。

由于bug in Django,覆盖registration/logged_out.html模板会覆盖admin" 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'),

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

如果你想在退出后将用户重定向回主页,我会使用第一个选项,如果你想显示"退出"我将使用第二个选项。消息。