2016-08-09 2 views
0

Я использую Django 1.9.8 и начал обучение, следуя the official tutorial. В официальном учебном пособии подчеркивается необходимость повторного использования и «плавность». Оттуда я последовал за this учебным пособием по авторизации. Хотя мне удалось заставить учебник авторизации работать, одна вещь об этом, которую мне не нравилась (или просто не понимаю), - это то, что файл проекта urls.py содержит несколько URL-адресов, специфичных для приложения, вместо того, чтобы помещать их вприложения файл и просто включить этот файл в файл проекта urls.py. Это похоже на то, что подчеркивает официальный учебник. Я понимаю, что у каждого проекта могут быть разные URL-адреса для входа/выхода/регистрации и т. Д. ... в зависимости от API и все равно придется редактировать, но я чувствую, что смена их в одном месте имеет больше смысла и делает вещи более аккуратными.Django url и файловая структура для шаблонов

Название проекта authtest и имя приложения логарифмически

#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. ру)? Может быть, есть причины для аутентификации, но не о чем, если бы я делал другое приложение?

Теперь для моего второго вопроса, который, я полагаю, зависит от ответа на первый вопрос. В руководстве по авторизации размещаются шаблоны 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 

Когда я двигаю файлы, я получаю следующую ошибку TemplateDoesNotExist at /login/, когда я посещаю http://localhost:8080/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', 
      ], 
     }, 
    }, 
] 
+0

пожалуйста, напишите ваш settings.py показывая TEMPLATE_DIRS директивы – nkhumphreys

+0

Это в значительной степени предпочтения. Есть небольшие отличия, но ничего серьезного. О 'TemplateDoesNotExist': имя шаблона должно относиться к любому шаблону' templates', в котором находится шаблон. Если вы переместите его в 'templates/log/base.html', вы должны передать' log/base.html' в 'login'. Каталог 'log' предотвращает конфликты имен между несколькими приложениями, используя шаблон' base.html'. – knbk

+0

@nkhumphreys Спасибо, я обновил сообщение – user1852176

ответ

1

В вашей settings.py вам нужно добавить ключ loaders в OPTIONS разделе. Это указывает, как 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 для получения дополнительной информации

+0

Я частично получил его работу. Приложение для регистрации не было в установленных приложениях. Я добавил его и сохранил свою первоначальную директиву шаблонов. Я изменил текст в моем файле входа (в каталоге шаблонов приложения) и появились изменения. Затем я переименовал папку шаблонов проекта только для проверки, но у меня появилась ошибка, указывающая, что мой файл base.html не существует. Django по-прежнему ищет файл base.html в папке шаблонов проекта, но я не помню, чтобы определить его в моих настройках или файлах urls.py. Я думаю, что это какая-то «магия» Django на работе, но я не знаю, где искать – user1852176

+0

, вам нужно изменить свой '{% extend base.html%}' в папке шаблона приложения журнала на '{% extend log/base.html%} ', так как это новый путь – gbozee

+0

Означает ли это, что лучше сохранить base.html в каталоге шаблонов моего проекта и просто перенести приложения в это приложение? Должен ли я расширять этот файл для каждого приложения, которое я добавляю в проект? – user1852176

Смежные вопросы