模板的Django url和文件结构



我使用的是Django 1.9.8,并从官方教程开始学习。官方教程强调了可重用性和"可插拔性"。从那时起,我就开始学习这个关于授权的教程。虽然我能够获得授权教程的工作,关于它的一件事,我不喜欢(或只是不理解)是为什么项目的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 (login &退出)的项目的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/。我假设这仅仅是url .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中,您需要在OPTIONS部分添加loaders键。这指定django如何找到你的template files。如果您没有指定OPTIONS键,则APP_DIRS设置应该足够了。

TEMPLATES = [
{
    # See: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATES-BACKEND
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-dirs
    'DIRS': [
        str(APPS_DIR.path('templates')),
    ],
    'OPTIONS': {
        # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug
        'debug': DEBUG,
        # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-loaders
        # https://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types
        'loaders': [
            'django.template.loaders.filesystem.Loader',
            'django.template.loaders.app_directories.Loader',
        ],
        # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-context-processors
    },
},

)

https://docs.djangoproject.com/en/1.10/ref/templates/api/#loader-types获取更多信息

最新更新