Qual é o melhor local para colocar modelos no projeto django?
Respostas:
Do livro Django, capítulo 4 :
Se você não consegue pensar em um lugar óbvio para colocar seus modelos, recomendamos a criação de um diretório de modelos dentro do seu projeto Django (ou seja, dentro do diretório meusite que você criou no Capítulo 2, se tiver seguido nossos exemplos).
Isso é exatamente o que eu faço e funcionou muito bem para mim.
Minha estrutura de diretório é semelhante a esta:
/mediapara todos os meus CSS / JS / imagens etc
/templatespara meus modelos
/projectnamepara o código do projeto principal (ou seja, o código Python)
Colocado <PROJECT>/<APP>/templates/<APP>/template.htmlpara modelos específicos de aplicativos para ajudar a tornar o aplicativo reutilizável em outro lugar.
Para modelos "globais" gerais, eu os coloco em <PROJECT>/templates/template.html
<APP>segundos <PROJECT>/<APP>/templates/<APP>/template.html?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRSagora está obsoleto - você deve adicionar DIRS=[os.path.join(BASE_DIR, "templates")]a TEMPLATES- consulte stackoverflow.com/questions/29725132/…
Seguindo de Dominic e dlrust,
Usamos uma distribuição de fonte setuptools (sdist) para empacotar nosso projeto django e aplicativos para implantar em nossos diferentes ambientes.
Descobrimos que os modelos e arquivos estáticos precisam estar nos diretórios do aplicativo django para que possam ser empacotados por ferramentas de instalação.
Por exemplo, nosso modelo e caminhos estáticos se parecem com:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
Para que isso funcione, o MANIFEST.in precisa ser modificado (consulte http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )
Um exemplo de MANIFEST.in:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
Além disso, você precisa confirmar no arquivo de configurações do django que o carregador app_directories está em seu TEMPLATE_LOADERS. Acho que está lá por padrão no Django 1.4.
Um exemplo dos carregadores de modelo de configurações django:
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
Caso você esteja se perguntando por que usamos sdists em vez de apenas arquivos rsync; faz parte de nosso fluxo de trabalho de gerenciamento de configuração, onde temos um único tarball de construção que é implantado com PIP inalterado em ambientes de teste, aceitação e produção.
/static/em seu plano de layout ao pensar em modelos e aplicativos modulares. Você pode mencionar outra prática recomendada, colocar cssarquivos em uma pasta chamada da static/app/cssmesma forma para jse talvez jpgou apenas /static/app/images.
DJANGO 1.11
adicione a pasta de modelos onde o manage.py existe, que é seu diretório base. altere os DIRS para MODELOS conforme a seguir em settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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',
],
},
},
]
Agora, para usar o modelo usando o código,
def home(request):
return render(request,"index.html",{})
em views.py. isso funciona perfeitamente bem para Django 1.11
Eu entendi que TEMPLATE_DIRSrequer um caminho absoluto. E eu não gosto de caminhos absolutos no meu código. Então, isso está funcionando bem para mim, em settings.py:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
BASE_DIR, então você pode simplificar isso para:os.path.join(BASE_DIR, '../APPNAME/templates')
Django 1.10
TEMPLATE_DIRS está obsoleto.
Agora precisamos usar TEMPLATE, apresentando o Django 1.8 assim:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
Depois de definir TEMPLATES, você pode remover com segurança ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS e TEMPLATE_STRING_IF_INVALID.
Sobre a melhor localização, Django procurando por um modelo como este:
Mais informações: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
A solução anterior não funcionou no meu caso. Eu usei:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
TEMPLATE_DIRSestá obsoleto agora.
BASE_DIR, então você pode simplificar isso para:os.path.join(BASE_DIR, '../myapp/templates')
Você também pode considerar ter seus templates em um banco de dados, usando django-dbtemplates . Ele também é configurado para armazenamento em cache e o aplicativo django-reversion que o ajuda a manter versões antigas de seus modelos.
Funciona muito bem, mas eu prefiro um pouco mais de flexibilidade na importação / sincronização de / para o sistema de arquivos.
[editar: 20 de agosto de 2018 - este repositório não está disponível, um com o mesmo nome está disponível em https://github.com/jazzband/django-dbtemplates e foi atualizado 8 meses atrás. Eu não uso mais o Django de forma significativa, então não posso garantir isso.]