Qual é o melhor local para colocar modelos no projeto django?

88

Qual é o melhor local para colocar modelos no projeto django?

Vishal
fonte

Respostas:

50

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)

Dominic Rodger
fonte
1
quando você coloca os templates em / templates, há uma maneira de dizer ao carregador de template para carregá-lo sem especificar o caminho completo para / template em TEMPLATE_DIRS para carregar com django.template.loaders.filesystem.Loader? Seria ótimo fazer isso com um caminho relativo, e em 1.4 meu carregador não está procurando em <projeto> / templates
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
87

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

ferrugem
fonte
11
Quer saber o motivo de 2 <APP>segundos <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia,
18
O primeiro / app / templates é apenas para agrupar modelos com seus aplicativos relevantes. O segundo aplicativo é para evitar colisões de nomes. (Presumivelmente, você apontará TEMPLATE_DIRS para apontar para cada um desses diretórios, mas no final, o Django os agrupa em um diretório gigante.) Veja: docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista
3
Para que isso funcione (django 1.6), eu tive que adicionar uma diretiva para o carregador de modelo do sistema de arquivos:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman
3
Esta resposta é antiga, mas de alguma forma acabei aqui. Para registro, TEMPLATE_DIRSagora está obsoleto - você deve adicionar DIRS=[os.path.join(BASE_DIR, "templates")]a TEMPLATES- consulte stackoverflow.com/questions/29725132/…
John Aaron
9

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.

o analista de surf
fonte
1
+1 Obrigado por fornecer detalhes extras e linhas de exemplo.
gotgenes
1 inteligente para incluir /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.
horas
7

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

Alan paul
fonte
1

Esta é mais uma escolha pessoal no nível do projeto. Se você está falando sobre aplicativos que precisam ser plugáveis, um diretório de modelos em seu aplicativo é o lugar onde eles se tornam padrão. Mas em todo o projeto, é o que funciona melhor para você.

SleighBoy
fonte
1

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")
)
kqw
fonte
1
Os projetos Django já têm seu caminho base definido no settings.py as padrão BASE_DIR, então você pode simplificar isso para:os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue
1

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:

  • DIRS define uma lista de diretórios onde o mecanismo deve procurar por arquivos de origem de modelo, na ordem de pesquisa.
  • APP_DIRS informa se o mecanismo deve procurar modelos dentro dos aplicativos instalados. Cada backend define um nome convencional para o subdiretório dentro dos aplicativos onde seus modelos devem ser armazenados.

Mais informações: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration

Wilfried
fonte
0

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") ]
user6916739
fonte
Veja minha resposta. TEMPLATE_DIRSestá obsoleto agora.
Wilfried
Os projetos Django já têm seu caminho base definido no settings.py as padrão BASE_DIR, então você pode simplificar isso para:os.path.join(BASE_DIR, '../myapp/templates')
ngoue
0

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.]

TonyM
fonte
Quando isso seria uma boa ideia? Não é mais lento carregar modelos do banco de dados?
jguffey
Você não se torna dependente do banco de dados se armazenar templates no banco de dados, além de tornar seu banco de dados parte do git commits? Como você coordenará as alterações feitas por diferentes usuários nos modelos?
gautamaggarwal
Isso foi escrito antes de eu conhecer o git. Nem tenho certeza se estava usando svn na época. Eu recomendo usar sistemas de controle de versão agora.
TonyM
@tonemcd, este repositório foi excluído.
lmiguelvargasf