Nano Hash - криптовалюты, майнинг, программирование

URL-адреса и файловая структура Django для шаблонов

Я использую 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-адреса приложения журнала (вход и выход) из файла 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

Когда я перемещаю файлы, я получаю следующую ошибку 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',
            ],
        },
    },
]

  • опубликуйте свой файл settings.py, показывающий директиву TEMPLATE_DIRS 09.08.2016
  • Это во многом предпочтение. Есть небольшие отличия, но ничего серьезного. О TemplateDoesNotExist: имя шаблона должно относиться к тому каталогу templates, в котором находится шаблон. Если вы переместите его в templates/log/base.html, вы должны передать log/base.html функции login. Каталог log предотвращает конфликты имен между несколькими приложениями, использующими шаблон base.html. 09.08.2016
  • @nkhumphreys Спасибо, я обновил свой пост. 09.08.2016
  • @knbk дело в том, что я никогда не создавал метод входа в файл журнала views.py, поэтому я не уверен, как передать местоположение файла. В руководстве по авторизации показан весь код, который я использовал. 09.08.2016
  • @user1852176 user1852176 Это параметр template_name в вашем urls.py. Вы уже передаете его в представление, вам просто нужно изменить его на это: url(r'^login/$', views.login, {'template_name': 'log/login.html', 'authentication_form': LoginForm }), 09.08.2016
  • @knbk Я попробовал это и получил TemplateDoesNotExist при ошибке /login/. В трассировке видно, что Django пытается загрузить его из корневого каталога шаблонов проекта, а не из каталога шаблонов приложения. Это показывает, что Django пытается получить его из /Users/.../DjangoProjects/authtest/templates/log/login.html, а не из /Users/.../DjangoProjects/authtest/log/templates/log/login.html. Пожалуйста, взгляните на структуру файла выше (показана вторая) для лучшего представления. Спасибо! 09.08.2016

Ответы:


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 для получения дополнительной информации

09.08.2016
  • У меня частично получилось. Приложение журнала отсутствовало в установленных приложениях. Я добавил его и сохранил исходную директиву шаблонов. Я изменил некоторый текст в моем файле входа в систему (в каталоге шаблонов приложения), и изменения появились. Затем я переименовал папку шаблонов проекта просто для проверки, но получил сообщение об ошибке, в котором говорилось, что мой файл base.html не существует. Django все еще ищет файл base.html в папке шаблонов проекта, но я не помню, чтобы он определялся где-либо в моих настройках или файлах urls.py. Я думаю, это какая-то магия Джанго в действии, но я не знаю, где искать 09.08.2016
  • вам нужно изменить `{% extend base.html %}` в папке шаблона приложения журнала на {% extend log/base.html %}, так как это новый путь 09.08.2016
  • Означает ли это, что лучше оставить base.html в каталоге шаблонов моего проекта и просто переместить файлы, относящиеся к конкретному приложению, в это приложение? Придется ли мне расширять этот файл для каждого приложения, которое я добавляю в проект? 09.08.2016
  • Да, это. Вы можете создать base.html в каталоге приложения, который напрямую расширяет base.html проекта, а затем другие html-файлы в каталоге приложения расширяют локальный файл base.html. 09.08.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..