Apa lokasi terbaik untuk meletakkan template dalam proyek django?
Jawaban:
Dari buku Django, bab 4 :
Jika Anda tidak dapat memikirkan tempat yang jelas untuk meletakkan cetakan Anda, kami merekomendasikan membuat direktori cetakan dalam proyek Django Anda (yaitu, dalam direktori mysite yang Anda buat di Bab 2, jika Anda telah mengikuti contoh kami).
Inilah yang saya lakukan, dan telah berhasil dengan baik untuk saya.
Struktur direktori saya terlihat seperti ini:
/mediauntuk semua CSS / JS / gambar
/templatessaya dll untuk template saya
/projectnameuntuk kode proyek utama (yaitu kode Python)
Ditempatkan <PROJECT>/<APP>/templates/<APP>/template.htmluntuk templat khusus aplikasi untuk membantu membuat aplikasi dapat digunakan kembali di tempat lain.
Untuk template "global" umum saya memasukkannya <PROJECT>/templates/template.html
<APP>detik masuk <PROJECT>/<APP>/templates/<APP>/template.html?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRSsekarang tidak digunakan lagi - Anda sebaiknya menambahkan DIRS=[os.path.join(BASE_DIR, "templates")]ke TEMPLATES- lihat stackoverflow.com/questions/29725132/…
Tindak lanjut dari Dominic dan dlrust,
Kami menggunakan distribusi sumber setuptools (sdist) untuk mengemas proyek dan aplikasi django kami untuk diterapkan di lingkungan kami yang berbeda.
Kami telah menemukan bahwa templat dan berkas statis perlu berada di bawah direktori aplikasi django sehingga bisa dipaketkan oleh setuptools.
Misalnya, template dan jalur statis kami terlihat seperti:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
Agar ini bekerja, MANIFEST.in perlu dimodifikasi (lihat http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )
Contoh dari MANIFEST.in:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
Juga, Anda perlu mengkonfirmasi dalam file pengaturan django Anda bahwa pemuat app_directories ada di TEMPLATE_LOADERS Anda. Saya pikir itu ada secara default di django 1.4.
Contoh pemuat template pengaturan 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',
)
Untuk berjaga-jaga jika Anda bertanya-tanya mengapa kami menggunakan sdists daripada hanya menangani file rsync; itu adalah bagian dari alur kerja manajemen konfigurasi kami di mana kami memiliki satu build tarball yang diterapkan dengan PIP tidak berubah menjadi lingkungan pengujian, penerimaan, dan produksi.
/static/dalam rencana tata letak Anda saat memikirkan tentang templat dan aplikasi modular. Anda mungkin ingin menyebutkan praktik terbaik lainnya, meletakkan cssfile dalam folder yang disebut static/app/cssjuga untuk jsdan mungkin jpgatau hanya /static/app/images.
DJANGO 1.11
tambahkan folder template di mana ada manage.py, yang merupakan direktori dasar Anda. ubah DIRS untuk TEMPLATES sebagai berikut di settings.py Anda
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',
],
},
},
]
Sekarang untuk menggunakan template dengan menggunakan kode,
def home(request):
return render(request,"index.html",{})
di views.py. ini bekerja dengan baik untuk django 1.11
Saya mengerti TEMPLATE_DIRSmembutuhkan jalan yang mutlak. Dan saya tidak suka jalur absolut dalam kode saya. Jadi ini bekerja dengan baik untuk saya, di settings.py:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
BASE_DIR, jadi anda dapat menyederhanakan ini menjadi:os.path.join(BASE_DIR, '../APPNAME/templates')
Django 1.10
TEMPLATE_DIRS sudah ditinggalkan.
Sekarang kita perlu menggunakan TEMPLATE, memperkenalkan Django 1.8 seperti ini:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
Setelah Anda menentukan TEMPLATES, Anda dapat dengan aman menghapus ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS, dan TEMPLATE_STRING_IF_INVALID.
Tentang lokasi terbaik, Django mencari template seperti ini:
Informasi lebih lanjut: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
Solusi sebelumnya tidak berhasil dalam kasus saya. Saya menggunakan:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
TEMPLATE_DIRSsudah usang sekarang.
BASE_DIR, jadi anda dapat menyederhanakan ini menjadi:os.path.join(BASE_DIR, '../myapp/templates')
Anda juga bisa mempertimbangkan untuk memiliki templat Anda dalam database, menggunakan django-dbtemplates . Ini juga diatur untuk caching, dan aplikasi django-reversion yang membantu Anda menyimpan versi lama dari templat Anda.
Ini berfungsi cukup baik, tetapi saya lebih suka sedikit lebih banyak fleksibilitas pada impor / sinkronisasi ke / dari sisi sistem file.
[sunting: 20 Agustus 2018 - repositori ini tidak tersedia, repositori dengan nama yang sama tersedia di https://github.com/jazzband/django-dbtemplates dan telah diperbarui 8 bulan yang lalu. Saya tidak lagi menggunakan Django dengan cara yang berarti, jadi tidak dapat menjamin ini.]