Jalur cetakan Django

90

Saya mengikuti tutorial di http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 di lingkungan Windows 7. File pengaturan saya adalah:

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

Saya mendapatkan base_templatedari templat admin/base_site.htmldari dalam direktori templat admin Django default dalam kode sumber Django itu sendiri (django / contrib / admin / templates) ke dalam subdirektori admin dari direktori myapp sebagai tutorial yang diinstruksikan.

Tampaknya tidak berpengaruh karena beberapa alasan. Ada petunjuk tentang apa masalahnya? Apakah saya harus melakukan sinkronisasi db?

shaytac.dll
sumber

Jawaban:

183

Saya tahu ini tidak ada dalam tutorial Django, dan memalukannya, tapi lebih baik untuk menyiapkan jalur relatif untuk variabel jalur Anda. Anda dapat mengaturnya seperti ini:

import os.path

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

...

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

TEMPLATE_DIRS = [
    os.path.join(PROJECT_PATH, 'templates/'),
]

Dengan cara ini Anda dapat memindahkan proyek Django Anda dan akar jalur Anda akan diperbarui secara otomatis. Ini berguna saat Anda menyiapkan server produksi Anda.

Kedua, ada sesuatu yang mencurigakan pada jalur TEMPLATE_DIRS Anda. Ini harus mengarah ke root direktori template Anda. Juga, itu juga harus diakhiri dengan sebuah trailing /.

Saya hanya akan menebak di sini bahwa .../admin/direktori tersebut bukan root template Anda. Jika Anda masih ingin menulis jalur absolut, Anda harus mengambil referensi ke direktori template admin.

TEMPLATE_DIRS = [
    'C:/django-project/myapp/mytemplates/',
]

Karena itu, pemuat template secara default harus disiapkan untuk melintasi direktori aplikasi Anda secara rekursif untuk menemukan file template.

TEMPLATE_LOADERS = [
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    # 'django.template.loaders.eggs.load_template_source',
]

Anda tidak perlu menyalin template admin kecuali jika Anda secara khusus ingin menimpa sesuatu.

Anda harus menjalankan syncdb jika Anda belum menjalankannya. Anda juga perlu server file media Anda secara statis jika Anda hosting django melalui runserver.

digitaldreamer
sumber
1
terima kasih banyak menghapus "/ admin" di akhir jalur relatif TEMPLATE_DIRS melakukannya.
shaytac
1
Saran ini menempatkan direktori template di dalam folder proyek. Untuk pengaturan yang lebih baik, apakah lebih masuk akal untuk memasukkannya ke dalam folder aplikasi?
Sahas Katta
2
Ini memperbaiki masalah saya. Terima kasih. TAPI, file pengaturan default memiliki komentar dengan TEMPLATE_DIRS mengatakan, "Jangan lupa untuk menggunakan path absolut, bukan path relatif." Adakah yang tahu alasan untuk komentar itu?
bhekman
1
PROJECT_PATH adalah jalur absolut dari folder proyek. Metode ini menyetel jalur media absolut secara dinamis pada waktu proses sehingga nilainya tidak dikodekan dengan keras dan dapat berubah secara otomatis dengan lokasi proyek. Ini adalah posting lama tetapi Anda dapat menggunakan ini untuk menentukan lokasi folder atau file apa pun dalam proyek.
digitaldreamer
2
Saya akan menyarankan menggunakan os.path.joinuntuk menambahkan jalur ke dir basis.
antonagestam
34

Jika menggunakan pengaturan Django seperti yang terinstal, lalu mengapa tidak menggunakan baked-in, BASE_DIR dan TEMPLATES yang telah ditentukan sebelumnya? Di pip yang dipasang Django (v1.8), saya mendapatkan:

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
sumber
1
«BASE_DIR + '/ templates /',» ini berhasil. Dan itu terlihat jauh lebih elegan, daripada bagian yang terpisah juga.
Maxiller
2
digunakan os.path.join(BASE_DIR, 'templates')untuk jalur agar tidak bergantung pada platform.
Abhyudai
12

Solusi cerdas dalam Django 2.0.3 untuk menyimpan templat dalam direktori proyek ( /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],
...

di views.py cukup tambahkan jalur template seperti itu:

app_name/html_name
2RMalinowski
sumber
9

Untuk Django 1.6.6:

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

Juga statis dan media untuk mode debug dan produksi:

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%

Ke urls.py Anda harus menambahkan:

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)

Dalam Django 1.8 Anda dapat menyetel jalur templat, backend dan parameter lain untuk templat dalam satu kamus ( 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',
            ],
        },
    },
]

Dokumen resmi.

Dunaevsky Maxim
sumber
Path Template harus berupa tupel: gunakan TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),) ini
renderbox
6

Saya juga mengalami masalah dengan bagian tutorial ini (tutorial yang digunakan untuk versi 1.7).

Kesalahan saya adalah saya hanya mengedit string 'administrasi Django', dan tidak cukup memperhatikan manual.

Ini adalah baris dari django / contrib / admin / templates / admin / base_site.html :

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

Namun setelah beberapa waktu dan frustrasi, menjadi jelas bahwa ada pernyataan 'site_header atau default: _', yang harus dihapus. Jadi setelah menghapus pernyataan (seperti contoh di manual semuanya bekerja seperti yang diharapkan).

Contoh manual:

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

Baiklah 😁 Katakanlah Anda memiliki proyek baru, jika demikian Anda akan pergi ke settings.pyfile dan mencari TEMPLATESbegitu Anda menemukannya, Anda cukup menempelkan baris ini os.path.join(BASE_DIR, 'template')di 'DIRS'Akhir, Anda akan mendapatkan sesuatu seperti ini:

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

Jika Anda ingin tahu di mana direktori BASE_DIR Anda berada, ketikkan 3 perintah sederhana ini:

python3 manage.py shell

Setelah Anda berada di shell:

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

PS: Jika Anda menamai folder template Anda dengan nama lain, Anda juga akan mengubahnya di sini.


sumber
2

Dalam django 3.1, masuk ke pengaturan proyek Anda dan impor 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
sumber
1

Dalam django 2.2 ini dijelaskan di sini

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,
        ...
    },
]
soda
sumber
0

pada dasarnya BASE_DIRadalah direktori proyek django Anda, direktori yang sama di mana manage.py.

    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
sumber
0

Bertentangan dengan beberapa jawaban yang diposting di utas ini, menambahkan 'DIRS': ['templates'] tidak berpengaruh karena 'cetakan' adalah jalur default dimana Django mencari cetakan.

Jika Anda mencoba mereferensikan template aplikasi, pastikan aplikasi Anda ada dalam daftar INSTALLED_APPSdi project utama settings.py.

INSTALLED_APPS': [
   # ...
   'my_app',
]
peterchaula.dll
sumber