【问题标题】:Django urls and file structure for templates模板的 Django url 和文件结构
【发布时间】: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


【解决方案1】:

在您的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了解更多信息

【讨论】:

  • 我部分得到了它的工作。已安装的应用程序中缺少日志应用程序。我添加了它并保留了我原来的模板指令。我更改了登录文件上的一些文本(在应用程序的模板目录中)并且更改出现了。然后我重命名了项目的模板文件夹以进行测试,但我收到一条错误消息,指出我的 base.html 文件不存在。 Django 仍在项目的模板文件夹中寻找 base.html 文件,但我不记得在我的设置或 urls.py 文件中的任何地方定义它。我认为这是 Django 在工作中的一些“魔法”,但我不知道在哪里看
  • 您需要将日志应用程序模板文件夹中的`{% extend base.html %}`更改为{% extend log/base.html %},因为这是新路径
  • 这是否意味着将 base.html 保留在我的项目的模板目录中并将特定于应用程序的内容移动到该应用程序是一个更好的主意?我是否必须为添加到项目中的每个应用程序扩展该文件?
  • 是的。你可以选择在app目录下创建一个base.html直接扩展项目的base.html,然后app目录下的其他html文件扩展本地的base.html文件
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 2012-03-31
  • 2021-06-17
  • 2017-05-28
  • 2017-09-05
  • 1970-01-01
  • 2018-10-29
  • 2017-01-15
相关资源
最近更新 更多