Caminho do modelo Django

87

Estou seguindo o tutorial em http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 em um ambiente Windows 7. Meu arquivo de configurações é:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

Peguei o base_templatedo template admin/base_site.htmlde dentro do diretório de templates de admin do Django no código-fonte do próprio Django (django / contrib / admin / templates) em um subdiretório admin do diretório myapp conforme o tutorial instruiu.

Não parece ter efeito por algum motivo. Alguma pista de qual pode ser o problema? Eu tenho que fazer uma sincronização do banco de dados?

Shaytac
fonte

Respostas:

182

Eu sei que isso não está no tutorial do Django, e que vergonha para eles, mas é melhor configurar caminhos relativos para suas variáveis ​​de caminho. Você pode configurá-lo assim:

import os

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = PROJECT_PATH + '/media/'

TEMPLATE_DIRS = (
    PROJECT_PATH + '/templates/',
)

Desta forma, você pode mover seu projeto Django e suas raízes de caminho serão atualizadas automaticamente. Isso é útil quando você está configurando seu servidor de produção.

Em segundo lugar, há algo suspeito no caminho TEMPLATE_DIRS. Ele deve apontar para a raiz do diretório do seu modelo. Além disso, também deve terminar em um trailing /.

Só vou adivinhar aqui que o .../admin/diretório não é a raiz do seu modelo. Se você ainda deseja escrever caminhos absolutos, você deve tirar a referência ao diretório de modelos de administração.

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/'
)

Com isso dito, os carregadores de modelo, por padrão, devem ser configurados para percorrer recursivamente nos diretórios de seu aplicativo para localizar arquivos de modelo.

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
#     'django.template.loaders.eggs.load_template_source',
)

Você não deve precisar copiar os modelos de administração, a menos que queira sobrescrever algo especificamente.

Você terá que executar um syncdb se ainda não o tiver executado. Você também precisará servir estaticamente aos seus arquivos de mídia se estiver hospedando django através do runserver.

sonhador digital
fonte
1
muito obrigado removendo "/ admin" no final do caminho relativo TEMPLATE_DIRS fez isso.
shaytac de
1
Esta sugestão coloca o diretório de modelos dentro da pasta do projeto. Para melhor organização, faz mais sentido colocá-lo dentro da pasta de um aplicativo?
Sahas Katta
2
Isso resolveu meu problema. Obrigado. MAS, o arquivo de configurações padrão tinha um comentário com TEMPLATE_DIRS dizendo, "Não se esqueça de usar caminhos absolutos, não caminhos relativos." Alguém sabe a justificativa para esse comentário?
bhekman
1
PROJECT_PATH é o caminho absoluto da pasta do projeto. Este método define o caminho de mídia absoluto dinamicamente no tempo de execução para que o valor não seja codificado permanentemente e possa mudar automaticamente com a localização do projeto. Esta é uma postagem antiga, mas você pode usá-la para definir a localização de qualquer pasta ou arquivo no projeto.
digitaldreamer
2
Eu sugeriria usar os.path.joinpara anexar caminhos ao diretório base.
antonagestam
34

Se estiver usando as configurações do Django como instaladas, por que não apenas usar seus BASE_DIR e TEMPLATES predefinidos integrados? No Django instalado pelo pip (v1.8), recebo:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            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',
            ],
        },
    },
]
NathanQ
fonte
1
este «BASE_DIR + '/ templates /',» funcionou. E parece muito mais elegante, em vez de uma seção separada também.
Maxiller
1
use os.path.join(BASE_DIR, 'templates')para que o caminho seja independente da plataforma.
Abhyudai
10

Solução inteligente no Django 2.0.3 para manter modelos no diretório do projeto ( /root/templates/app_name):

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

em views.py basta adicionar o caminho do modelo:

app_name/html_name
2RMalinowski
fonte
8

Para Django 1.6.6:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

Também estático e mídia para modo de depuração e produção:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

Em urls.py você deve adicionar:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

No Django 1.8 você pode definir caminhos de template, backend e outros parâmetros para templates em um dicionário ( settings.py ):

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            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',
            ],
        },
    },
]

Documentos oficiais.

Dunaevsky Maxim
fonte
O caminho do modelo precisa ser uma tupla: use este TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),)
renderbox
6

Eu também tive problemas com esta parte do tutorial (tutorial usado para a versão 1.7).

Meu erro foi que eu apenas editei a string 'Administração do Django' e não prestei atenção suficiente ao manual.

Esta é a linha de django / contrib / admin / templates / admin / base_site.html :

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

Mas depois de algum tempo e frustração, ficou claro que havia a instrução 'site_header ou default: _', que deveria ser removida. Portanto, após remover a declaração (como no exemplo do manual, tudo funcionou como esperado).

Manual de exemplo:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
jpoppe
fonte
2

Tudo bem 😁 Vamos dizer que você tem um novo projeto da marca, se assim você iria para o settings.pyarquivo e procurar TEMPLATESuma vez que você descobriu que você acabou de colar essa linha os.path.join(BASE_DIR, 'template')em 'DIRS'No final, você deve obter algumas coisas como esta:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

Se você quiser saber onde seu diretório BASE_DIR está localizado, digite estes 3 comandos simples:

python3 manage.py shell

Assim que estiver no shell:

>>> from django.conf import settings
>>> settings.BASE_DIR

PS: Se você nomeou sua pasta de modelo com outro nome, você mudaria aqui também.


fonte
1

No django 2.2, isso é explicado aqui

https://docs.djangoproject.com/en/2.2/howto/overriding-templates/

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

INSTALLED_APPS = [
    ...,
    'blog',
    ...,
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]
refrigerante
fonte
1

No django 3.1, vá para a configuração do seu projeto e importe os

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',
            ],
        },
    },
]
Prabesh
fonte
0

basicamente BASE_DIRé o diretório do seu projeto django, mesmo diretório onde manage.pyestá.

    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',
                ],
            },
        },
    ]
Dave
fonte