【发布时间】:2016-12-15 18:43:57
【问题描述】:
我正在使用 Django 1.9.8,并通过关注 the official tutorial 开始学习。官方教程强调可重用性和“可插入性”。从那里我遵循了this 授权教程。虽然我能够让授权教程正常工作,但我不喜欢(或只是不明白)的一件事是为什么项目的 urls.py 文件包含几个应用程序特定的 url,而不是将它们放在应用程序的urls.py 文件,并且只将该文件包含在项目的urls.py 文件中。这似乎与官方教程所强调的背道而驰。我知道每个项目可能有不同的 URL 用于登录/注销/注册等...取决于 API,并且仍然需要进行编辑,但我觉得在一个地方更改它们更有意义,并使事情更整洁。
项目名称为authtest,应用名称为log
#log/urls.py
from django.conf.urls import url, include
from django.contrib import admin
from django.contrib.auth import views
from log.forms import LoginForm
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'', include('log.urls')),
url(r'^login/$', views.login, {'template_name': 'login.html', 'authentication_form': LoginForm }), #move this to authtest/urls.py
url(r'^logout/$', views.logout, {'next_page': '/login'}), #move this to authtest/urls.py
]
现在为应用程序的urls.py 文件
#authtest/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.home, name='home'),
]
这 100% 有效,所以现在回答第一个问题。 有什么理由我不应该将日志应用程序特定的 url(登录和注销)移出项目的 urls.py 文件(log/urls.py)并将它们放入应用程序的 urls.py 文件(authtest/ urls.py)?也许有理由不进行身份验证,但如果我正在制作不同的应用程序呢?
现在我的第二个问题,我想这取决于第一个问题的答案。授权教程将 login.html、logout.html 和 home.html 模板放在项目的根模板文件夹中。 Django 教程建议将它们放在应用程序的模板目录中,并在该目录中,另一个目录命名为应用程序的名称(用于命名空间)。 如果我将应用程序特定的模板文件从项目的模板文件夹移动到日志应用程序的模板文件夹,我需要进行哪些更改?
这是我遵循的授权教程中的当前文件结构
authtest
|...authtest
|...|...settings.py
|...|...urls.py
|...log
|...|...settings.py
|...|...urls.py
|...|...views.py
|...manage.py
|...templates
|...|...base.html
|...|...home.html
|...|...login.html
|...static
这是我认为应该基于官方教程建议使用模板的方式。
authtest
|...authtest
|...|...settings.py
|...|...urls.py
|...log
|...|...urls.py
|...|...views.py
|...|...templates
|...|...|...log #namespace of the log app
|...|...|...|...base.html
|...|...|...|...home.html
|...|...|...|...login.html
|...manage.py
|...templates
|...static
当我移动文件时,我在访问http://localhost:8080/login/ 时收到以下错误TemplateDoesNotExist at /login/。我假设它只是 urls.py 文件,但我不确定我必须改变什么。
为 settings.py 模板指令编辑
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ["templates"],
#'DIRS': [os.path.join(BASE_DIR, 'templates')], #I also tried this
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
【问题讨论】:
-
请发布您的 settings.py 以显示 TEMPLATE_DIRS 指令
-
这主要是偏好。有一些小的差异,但没什么大不了的。关于
TemplateDoesNotExist:模板名称应与模板所在的templates目录相关。如果将其移动到templates/log/base.html,则应将log/base.html传递给login函数。log目录使用base.html模板防止多个应用程序之间的名称冲突。 -
@nkhumphreys 谢谢,我更新了我的帖子
-
@knbk 问题是,我从未在日志views.py 文件中创建登录方法,所以我不确定如何传递文件位置。授权教程展示了我使用的所有代码。
-
@user1852176 这就是
urls.py中的template_name参数。您已经将其传递给视图,只需将其更改为:url(r'^login/$', views.login, {'template_name': 'log/login.html', 'authentication_form': LoginForm }),
标签: python django templates django-urls