Saya hanya akan mulai dengan tip dari diri saya sendiri :)
Gunakan os.path.dirname () di settings.py untuk menghindari nama file yang di-hardcode.
Jangan lacak hardcode di pengaturan Anda .py jika Anda ingin menjalankan proyek Anda di lokasi yang berbeda. Gunakan kode berikut di settings.py jika templat dan file statis Anda berada di dalam direktori proyek Django:
# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
os.path.join(PROJECT_DIR, "templates"),
)
Penghargaan: Saya mendapatkan tip ini dari screencast ' Django From the Ground Up '.
j = lambda filename: os.path.join(PROJECT_DIR, filename)
. Maka Anda hanya perlu mengetikj("static")
.wontfix
keputusan tersebut.Instal Django Command Extensions dan pygraphviz lalu keluarkan perintah berikut untuk mendapatkan visualisasi model Django yang benar-benar bagus:
sumber
Gunakan dekorator django-menjengkelkan
render_to
bukanrender_to_response
.Diedit untuk menunjukkan bahwa mengembalikan HttpResponse (seperti pengalihan) akan membuat hubungan pendek dekorator dan bekerja seperti yang Anda harapkan.
sumber
Ada satu set tag khusus yang saya gunakan di seluruh templat situs saya. Mencari cara untuk memuat ulang secara otomatis (KERING, ingat?), Saya menemukan yang berikut:
Jika Anda meletakkan ini di modul yang dimuat secara default (misalnya urlconf utama Anda), Anda akan memiliki tag dan filter dari modul tag kustom Anda yang tersedia di template apa pun, tanpa menggunakan
{% load custom_tag_module %}
.Argumen yang diteruskan ke
template.add_to_builtins()
dapat berupa jalur modul apa pun; modul tag khusus Anda tidak harus hidup dalam aplikasi tertentu. Sebagai contoh, itu juga bisa menjadi modul di direktori root proyek Anda (mis.'project.custom_tag_module'
).sumber
Virtualenv + Python = life saver jika Anda bekerja pada beberapa proyek Django dan ada kemungkinan semuanya tidak bergantung pada versi Django / aplikasi yang sama.
sumber
virtualenv myNewEnv --no-site-packages
;. myNewEnv/bin/activate
;pip install django
; Dan itu berhasil!Jangan kode-keras URL Anda!
Gunakan nama url sebagai gantinya, dan
reverse
fungsinya untuk mendapatkan URL itu sendiri.Saat Anda menentukan pemetaan URL Anda, berikan nama ke URL Anda.
Pastikan namanya unik per URL.
Saya biasanya memiliki format yang konsisten "view-appplication-view", misalnya "cbx-forum-thread" untuk tampilan thread.
UPDATE (tanpa malu-malu mencuri tambahan ayaz ):
Nama ini dapat digunakan dalam templat dengan
url
tag .sumber
url
tag ... Sikapnya adalah bahwa url tidak boleh berubah pula (jika Anda ingin bersikap ramah kepada Anda pengguna).{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/…reverse
seperti inienvironment.filters['url'] = django.core.urlresolvers.reverse
dan Anda dapat menggunakannya di templat seperti:{{ 'view-name'|url(arg1, arg2)|e }}
("e" diperlukan untuk keluar dari beberapa karakter untuk dimasukkan dalam HTML)Gunakan bilah alat debug django . Misalnya, ini memungkinkan untuk melihat semua permintaan SQL yang dilakukan saat menampilkan tampilan dan Anda juga dapat melihat stacktrace untuk salah satu dari mereka.
sumber
Jangan menulis halaman login Anda sendiri. Jika Anda menggunakan django.contrib.auth.
Rahasia sebenarnya yang kotor adalah jika Anda juga menggunakan django.contrib.admin, dan django.template.loaders.app_directories.load_template_source ada di loader template Anda , Anda bisa mendapatkan template Anda juga gratis!
sumber
Pemroses konteks mengagumkan.
Katakanlah Anda memiliki model pengguna yang berbeda dan Anda ingin memasukkannya dalam setiap respons. Alih-alih melakukan ini:
Proses konteks memberi Anda kemampuan untuk meneruskan variabel apa pun ke templat Anda. Saya biasanya menaruh milik saya di
'my_project/apps/core/context.py
:Di
settings.py
tambahkan baris berikut ke AndaTEMPLATE_CONTEXT_PROCESSORS
Sekarang setiap kali permintaan dibuat itu termasuk
my_user
kunci secara otomatis.Sinyal juga menang.
Saya menulis posting blog tentang ini beberapa bulan yang lalu jadi saya hanya akan memotong dan menempel:
Di luar kotak Django memberi Anda beberapa sinyal yang sangat berguna. Anda memiliki kemampuan untuk melakukan hal-hal sebelum dan sesudah menyimpan, init, menghapus, atau bahkan ketika permintaan sedang diproses. Jadi mari kita menjauh dari konsep dan menunjukkan bagaimana ini digunakan. Katakanlah kita punya blog
Jadi, entah bagaimana, Anda ingin memberi tahu salah satu dari banyak layanan ping-blog yang kami buat pada posting baru, membangun kembali cache posting terbaru, dan men-tweet tentangnya. Baik dengan sinyal Anda memiliki kemampuan untuk melakukan semua ini tanpa harus menambahkan metode apa pun ke kelas Post.
Di sana kita pergi, dengan mendefinisikan fungsi itu dan menggunakan sinyal post_init untuk menghubungkan fungsi ke model Post dan menjalankannya setelah disimpan.
sumber
Ketika saya memulai, saya tidak tahu bahwa ada seorang Paginator , pastikan Anda tahu keberadaannya !!
sumber
Gunakan IPython untuk melompat ke kode Anda di tingkat mana pun dan debug menggunakan kekuatan IPython. Setelah Anda menginstal IPython, masukkan saja kode ini ke mana pun Anda ingin men-debug:
Kemudian, segarkan halaman, buka jendela runserver Anda dan Anda akan berada di jendela IPython interaktif.
Saya memiliki cuplikan yang diatur di TextMate jadi saya cukup ketik ipshell dan tekan tab. Saya tidak bisa hidup tanpanya.
sumber
ipdb
dan kemudian cukup ketikipdb.set_trace()
Jalankan server SMTP pengembangan yang hanya akan menampilkan apa pun yang dikirim kepadanya (jika Anda tidak ingin menginstal SMTP di server dev Anda.)
garis komando:
sumber
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
..that akan mencetak email kemanage.py
output.Dari dokumentasi django-admin :
Jika Anda menggunakan Bash shell, pertimbangkan untuk menginstal skrip penyelesaian Django bash, yang tinggal di
extras/django_bash_completion
dalam distribusi Django. Ini memungkinkan penyelesaian tabdjango-admin.py
danmanage.py
perintah, sehingga Anda dapat, misalnya ...django-admin.py
.sql
, kemudian [TAB], untuk melihat semua opsi yang tersedia yang namanya dimulaisql
.sumber
Fasilitas
./manage.py runserver_plus
yang datang dengan django_extensions benar-benar luar biasa.Ini menciptakan halaman debug ditingkatkan yang, antara lain, menggunakan debugger Werkzeug untuk membuat konsol debugging interaktif untuk setiap titik dalam tumpukan (lihat screenshot). Ini juga menyediakan metode debugging kenyamanan yang sangat berguna
dump()
untuk menampilkan informasi tentang suatu objek / bingkai.Untuk menginstal, Anda dapat menggunakan pip:
Kemudian tambahkan
'django_extensions'
keINSTALLED_APPS
tuple Andasettings.py
dan mulai server pengembangan dengan ekstensi baru:Ini akan mengubah cara Anda melakukan debug.
sumber
Saya suka menggunakan Python debugger pdb untuk men-debug proyek Django.
Tautan ini bermanfaat untuk mempelajari cara menggunakannya: http://www.ferg.org/papers/debugging_in_python.html
sumber
Saat mencoba bertukar data antara Django dan aplikasi lain,
request.raw_post_data
adalah teman yang baik. Gunakan untuk menerima dan memproses kustom, katakanlah, data XML.Dokumentasi: http://docs.djangoproject.com/en/dev/ref/request-response/
sumber
Gunakan Jinja2 bersama Django.
Jika Anda menemukan bahasa template Django sangat membatasi (seperti saya!) Maka Anda tidak perlu terjebak dengannya. Django fleksibel, dan bahasa templat longgar digabungkan ke seluruh sistem, jadi cukup plug-in bahasa templat lain dan gunakan untuk membuat tanggapan http Anda!
Saya menggunakan Jinja2 , hampir seperti versi yang didukung dari bahasa template Django, ia menggunakan sintaks yang sama, dan memungkinkan Anda untuk menggunakan ekspresi dalam pernyataan if! tidak perlu lagi membuat tag if seperti
if_item_in_list
! Anda bisa mengatakan%{ if item in list %}
, atau{% if object.field < 10 %}
.Tapi itu belum semuanya; ia memiliki lebih banyak fitur untuk memudahkan pembuatan template, yang tidak bisa saya lewati meskipun semuanya ada di sini.
sumber
Tambahkan
assert False
kode tampilan Anda untuk membuang informasi debug.sumber
5 / 0
diri saya sendiri. Kenapa lima? Tidak ada ide.Ini menambah jawaban di atas tentang nama URL Django dan membalikkan pengiriman URL .
Nama-nama URL juga dapat digunakan secara efektif dalam template. Misalnya, untuk pola URL yang diberikan:
Anda dapat memiliki yang berikut di templat:
sumber
Karena Django "views" hanya perlu menjadi callable yang mengembalikan HttpResponse, Anda dapat dengan mudah membuat tampilan berbasis kelas seperti yang ada di Ruby on Rails dan kerangka kerja lainnya.
Ada beberapa cara untuk membuat tampilan berbasis kelas, inilah favorit saya:
Anda dapat menambahkan segala macam hal lainnya seperti penanganan permintaan bersyarat dan otorisasi dalam tampilan dasar Anda.
Setelah pengaturan tampilan Anda, urls.py Anda akan terlihat seperti ini:
sumber
Alih-alih menggunakan
render_to_response
untuk mengikat konteks Anda ke templat dan merendernya (yang biasanya ditunjukkan oleh dokumen Django) gunakan tampilan umumdirect_to_template
. Itu melakukan hal yangrender_to_response
sama tetapi tidak secara otomatis menambahkan RequestContext ke konteks templat, secara implisit memungkinkan pemroses konteks untuk digunakan. Anda dapat melakukan ini secara manual menggunakanrender_to_response
, tetapi mengapa repot-repot? Ini hanya langkah lain untuk diingat dan LOC lain. Selain memanfaatkan pengolah konteks, memiliki RequestContext di template Anda memungkinkan Anda untuk melakukan hal-hal seperti:yang sangat bermanfaat. Bahkan, memberi +1 pada pandangan umum secara umum. Sebagian besar dokumen Django menunjukkannya sebagai pintasan karena bahkan tidak memiliki file views.py untuk aplikasi sederhana, tetapi Anda juga dapat menggunakannya di dalam fungsi tampilan Anda sendiri:
sumber
render
metode pintas baru dari Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )Saya tidak memiliki reputasi yang cukup untuk membalas komentar yang dimaksud, tetapi penting untuk dicatat bahwa jika Anda akan menggunakan Jinja , itu TIDAK mendukung karakter '-' dalam nama blok template, sementara Django melakukannya. Ini menyebabkan saya banyak masalah dan membuang-buang waktu untuk melacak pesan kesalahan yang sangat tidak jelas yang dihasilkannya.
sumber
The app webdesign sangat berguna ketika memulai untuk desain website Anda. Setelah diimpor, Anda dapat menambahkan ini untuk menghasilkan teks sampel:
sumber
django.db.models.get_model
memang memungkinkan Anda untuk mengambil model tanpa mengimpornya.James menunjukkan betapa mudahnya bisa: "Kiat Django: Tulis tag templat yang lebih baik - Iterasi 4" .
sumber
Semua orang tahu ada server pengembangan yang dapat Anda jalankan dengan "manage.py runserver", tetapi apakah Anda tahu bahwa ada tampilan pengembangan untuk menyajikan file statis (CSS / JS / IMG) juga?
Pendatang baru selalu bingung karena Django tidak datang dengan cara apa pun untuk melayani file statis. Ini karena tim pengembang berpikir itu adalah pekerjaan untuk server Web kehidupan nyata.
Tetapi ketika mengembangkan, Anda mungkin tidak ingin mengatur Apache + mod_wisgi, itu berat. Kemudian Anda bisa menambahkan yang berikut ke urls.py:
CSS / JS / IMG Anda akan tersedia di www.yoursite.com/site_media/.
Tentu saja, jangan menggunakannya di lingkungan produksi.
sumber
Saya belajar ini dari dokumentasi untuk thumbnail-sorl . Anda dapat menggunakan kata kunci "sebagai" dalam tag templat untuk menggunakan hasil panggilan di tempat lain dalam templat Anda.
Sebagai contoh:
Ini disebutkan secara sepintas dalam dokumentasi templatetag Django, tetapi hanya mengacu pada loop. Mereka tidak menyebut bahwa Anda dapat menggunakan ini di tempat lain (di mana saja?) Juga.
sumber
django.views.generic.list_detail.object_list - Ini menyediakan semua variabel template & template untuk pagination (salah satu dari mereka yang telah saya tuliskan-yang-seribu-kali-sekarang drudgeries). Membungkusnya memungkinkan untuk semua logika yang Anda butuhkan. Permata ini telah menyelamatkan saya berjam-jam untuk men-debug kesalahan satu per satu di halaman "Hasil Pencarian" saya dan membuat kode tampilan lebih bersih dalam proses.
sumber
IDE PyCharm adalah lingkungan yang baik untuk kode dan terutama debug, dengan dukungan bawaan untuk Django.
sumber
Gunakan xml_models untuk membuat model Django yang menggunakan backend XML REST API (bukan SQL satu). Ini sangat berguna terutama ketika memodelkan API pihak ketiga - Anda mendapatkan semua sintaks QuerySet yang sama dengan yang biasa Anda gunakan. Anda dapat menginstalnya dari PyPI.
XML dari API:
Dan sekarang dengan python:
Itu juga dapat menangani hubungan dan koleksi. Kami menggunakannya setiap hari dalam kode produksi yang banyak digunakan, jadi meskipun ini beta, itu sangat berguna. Ini juga memiliki set rintisan yang baik yang dapat Anda gunakan dalam tes Anda.
(Penafian: sementara saya bukan penulis perpustakaan ini, saya sekarang adalah seorang committer, telah membuat beberapa komitmen kecil)
sumber
Gunakan migrasi basis data. Gunakan Selatan .
sumber