Apa lokasi terbaik untuk meletakkan template dalam proyek django?

89

Apa lokasi terbaik untuk meletakkan template dalam proyek django?

Vishal
sumber

Jawaban:

50

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)

Dominic Rodger
sumber
1
ketika Anda meletakkan template di / templates, apakah ada cara untuk memberi tahu pemuat template untuk memuatnya tanpa menentukan path lengkap ke / template di TEMPLATE_DIRS untuk memuat dengan django.template.loaders.filesystem.Loader? Akan sangat bagus untuk melakukan ini dengan jalur relatif, dan di bawah 1.4 loader saya tidak melihat di bawah <project> / templates
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
87

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

dlrust
sumber
11
Ingin tahu alasan 2 <APP>detik masuk <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia
18
/ App / templates pertama hanya untuk mengelompokkan template dengan aplikasi yang relevan. Aplikasi kedua adalah untuk mencegah benturan nama. (Agaknya, Anda akan mengarahkan TEMPLATE_DIRS untuk menunjuk ke masing-masing direktori ini, tetapi pada akhirnya, Django menggabungkannya menjadi satu direktori raksasa.) Lihat: docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista
3
Agar ini bekerja (django 1.6), saya harus menambahkan direktif untuk pemuat templat sistem file:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman
3
Jawaban ini kuno, tetapi entah mengapa saya berakhir di sini. Sebagai catatan, TEMPLATE_DIRSsekarang tidak digunakan lagi - Anda sebaiknya menambahkan DIRS=[os.path.join(BASE_DIR, "templates")]ke TEMPLATES- lihat stackoverflow.com/questions/29725132/…
John Aaron
9

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.

kista selancar
sumber
1
+1 Terima kasih telah memberikan detail ekstra dan baris contoh.
gotgenes
+1 pintar untuk disertakan /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.
kompor
7

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

Alan Paul
sumber
1

Ini lebih merupakan pilihan pribadi di tingkat proyek. Jika Anda berbicara tentang aplikasi yang perlu dicolokkan, maka direktori templat di aplikasi Anda adalah tempat mereka menjadi default. Tapi di seluruh proyek, itulah yang terbaik untuk Anda.

SleighBoy
sumber
1

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")
)
kqw
sumber
1
Proyek-proyek Django memiliki jalur dasarnya yang sudah ditentukan dalam standar settings.py sebagai BASE_DIR, jadi anda dapat menyederhanakan ini menjadi:os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue
1

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:

  • DIRS mendefinisikan daftar direktori tempat mesin harus mencari file sumber template, dalam urutan pencarian.
  • APP_DIRS memberi tahu apakah mesin harus mencari templat di dalam aplikasi yang diinstal. Setiap backend menentukan nama konvensional untuk subdirektori di dalam aplikasi tempat templatnya harus disimpan.

Informasi lebih lanjut: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration

Wilfried
sumber
0

Solusi sebelumnya tidak berhasil dalam kasus saya. Saya menggunakan:

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
pengguna6916739
sumber
Lihat jawabanku. TEMPLATE_DIRSsudah usang sekarang.
Wilfried
Proyek-proyek Django memiliki jalur dasarnya yang sudah ditentukan dalam standar settings.py sebagai BASE_DIR, jadi anda dapat menyederhanakan ini menjadi:os.path.join(BASE_DIR, '../myapp/templates')
ngoue
0

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

TonyM
sumber
Kapan ini menjadi ide yang bagus? Bukankah lebih lambat untuk memuat template dari DB?
jguffey
Tidakkah Anda menjadi tergantung pada db jika Anda menyimpan template di db plus apakah Anda akan menjadikan db Anda bagian dari git commit? Bagaimana Anda akan mengoordinasikan antara perubahan yang dibuat oleh pengguna yang berbeda di template?
gautamaggarwal
Ini ditulis jauh sebelum saya menyadari git. Bahkan tidak yakin saya menggunakan svn pada saat itu. Saya akan merekomendasikan menggunakan sistem kontrol versi sekarang.
TonyM
@tonemcd, repositori ini telah dihapus.
lmiguelvargasf