2015-03-28 2 views
2

С более новой версией Django рекомендуется, чтобы статические файлы и шаблоны хранились внутри каталога, названного именем приложения. Напр. с более старыми версиями Django, структура приложение, выглядела примерно так:Django base.html соглашение о расширении

app 
├── admin.py 
├── __init__.py 
├── models.py 
├── static 
│   └── design.css 
├── templates 
│   ├── base.html 
│   └── index.html 
├── tests.py 
└── views.py 

в то время как с более новыми версиями, рекомендуемая структура выглядит следующим образом:

app 
├── admin.py 
├── __init__.py 
├── models.py 
├── static 
│   └── app 
│    └── design.css 
├── templates 
│   └── app 
│    ├── base.html 
│    └── index.html 
├── tests.py 
└── views.py 

Теперь, как я должен получить доступ к staticfiles и шаблоны представление приложения в соответствии с новым макетом приложения? То есть при доступе к имени шаблона в представлении рекомендуется ли жестко указывать имя приложения?

def index(request): 
    return render(request, 'blog/index.html', {}) 

Аналогично, в шаблоне index.html, который простирается base.html, он должен ссылаться следующим образом:

{% extends "blog/base.html" %} 

Опять же, это связано с именем жестко прописывать приложения в шаблоне. Это хорошая идея? Если я решит переименовать приложение, мне нужно будет внести изменения во множество файлов.

Или я отсутствует какой-либо параметр, который позволил бы мне передать base.html, как

{% extends "base.html" %} 

в своих шаблонах, избегая упоминать имя приложения?

+0

awesome .. я никогда не знал, что 'extends' и 'include' существуют .. – user568021

ответ

0

Я думаю, что жесткое кодирование имени приложения в шаблонах является хорошей идеей, так как у вас могут быть несколько приложений с шаблонами с тем же именем. Если вы просто поместите имя шаблона, Django возьмет первый шаблон с этим именем (что может быть неправильно, если у вас несколько шаблонов с тем же именем).

+0

Невозможно ли установить параметры таким образом, чтобы Django предоставлял предпочтение приложению 'base.html' выше, чем глобальное, или любое другое приложение' base.html', и все еще не требовать жесткого кодирования имени приложения? – abhinavkulkarni

+0

Я не думаю, что вы можете сделать это на шаблонах. В представлениях вы всегда можете указать имя приложения как глобальное, а затем написать шаблон как «appname +» /base.html »' – Jaakko

3

Это не имеет ничего общего с более ранними версиями django, это связано с тем, что команда collectstatic будет перезаписывать файлы с похожими именами; добавление вашего имени приложения создает «пространство имен» для ваших статических файлов.

Вы должны делать это только для статических файлов, шаблоны должны находиться в главном каталоге шаблонов для вашего приложения; и, конечно, если у вас есть шаблоны, которые не принадлежат к приложению, они должны идти в отдельный каталог (который добавляется к TEMPLATE_DIRS в settings.py).

шаблоны загружены TEMPLATE_LOADERS настройка; а по умолчанию - поиск в файловой системе, перейдя через каталоги в TEMPLATE_DIRS, а затем выполните поиск в любом каталоге template для установленных приложений, поиск которых осуществляется в порядке, указанном в INSTALLED_APPS.

Будет использоваться первый шаблон, который соответствует запрошенному. Это упрощает отправку шаблонов по умолчанию с вашим приложением, а затем позволяет конечным пользователям настраивать их; создав шаблон с тем же именем и поместив его в каталог, указанный в TEMPLATE_DIRS.

Чтобы избежать возможных столкновений, лучше всего добавить имя приложения в шаблон; поэтому, если у вас есть index.html, и ваше приложение называется foo, измените шаблон на foo_index.html (по умолчанию).

+0

@BurhanKahlid: я получаю вашу точку зрения о статических файлах и должен создать отдельное «пространство имен» для шаблонов каждого приложения, чтобы избежать конфликтов имен шаблонов. Один из способов - добавить имя приложения в имя шаблона, как вы предложили. Другим является создание каталога по имени приложения в разделе мастер шаблонов приложения. Похоже, это соглашение. Посмотрите популярное приложение 'django-registration'. Они, похоже, следуют более позднему соглашению. Однако в каждом из своих шаблонов они упомянули '{% extend 'base.html"%} '. Скажите, тогда это плохая практика от имени такого популярного приложения? – abhinavkulkarni

+0

Приложение 'django-registration' находится здесь: https://github.com/macropin/django-registration – abhinavkulkarni

+0

Пока вы можете предотвратить столкновения пространства имен, используйте все, что вам подходит. Всякий раз, когда мне нужно знать, как лучше что-то сделать, я вижу, как это делает django (поскольку все приложения-приложения являются приложениями django), и я следую этому соглашению. В частности, для вашего примера шаблоны расширяют [базовый шаблон] (https://github.com/macropin/django-registration/blob/master/test_app/templates/base.html), который предоставляется с их примерным приложением. –

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