Catatan terbitan Django 1.8¶
April 1, 2015
Selamat datang di Django 1.8!
Catatan terbitan ini mencangkup new features, sama halnya beberapa backwards incompatible changes anda akan ingin waspadai ketika meningkatkan dari Django 1.7 atau versi terlama. Kami juga telah begun the deprecation process for some features, dan beberapa telah dicapai pada akhir pengolahan pengusangan mereka dan have been removed.
Lihat panduan Meningkatkan Django ke versi terbaru jika anda sedang memperbaharui proyek yang ada.
Django 1.8 telah dirancang sebagai long-term support release kedua Django. Itu akan menerima pembaharuan keamanan untuk setidaknya tiga tahun setelah terbitannya. Dukungang untuk LTS sebelumnya, Django 1.4 akan berakhir 6 bulan dari tanggal terbitan Django 1.8.
Kesesuaian Python¶
Django 1.8 membutuhkan Python 2.7, 3.2, 3.3, 3.4 atau 3.5. Kami sangat menganjurkan dan hanya secara resmi mendukung terbitan terakhir dari setiap rangkaian.
Django 1.8 adalah terbitan pertama untuk mendukung Python 3.5.
Karena akhir dari dukungan hulu untuk Python 3,2 di Februari 2016, kami tidak akan mencoba Django 1.8.x di Python 3.2 setelah akhir dari 2016.
Apa yang baru di Django 1.8¶
API Model._meta¶
Django sekarang telah memerumuskan API untuk Model._meta, menyediakan sebuah cara dukungan resmi pada retrieve fields dan bidang penyaring berdasarkan pada attributes mereka.
Obyek Model._meta telah menjadi bagian dari Django sejak haru dari pra-0.96 "Magic Removal" -- Itu hanya bukan sebuah resmi, API stabil. Dalam mengenali ini, kami telah berusaha merawat kesesuaian-kebelakang dengan titik akhir API lama dimana memungkinkan. Bagaimanapun, titik akhir API yang bukan bagian dari API resmi baru telah diusangkan dan akhirnya akan dipindahkan. Sebuah ref:guide to migrating from the old API to the new API <migrating-old-meta-api> telah disediakan.
Banyak cetakan mesin¶
Django 1.8 menentukan API stabi untuk menyatukan backend cetakan. Itu menyertakan dukungan siap-pakai untuk bahasa cetakan Django dan untuk Jinja2. Itu mendukung membangun cetakan dengan banyak mesin dalam proyek sama. Pelajari lebih tentang fitur baru di topic guide dan periksa upgrade instructions untuk rincian.
Peningkatan keamanan¶
Beberapa fitur-fitur dari pustaka pihak-ketiga django-secure telah dipadukan kedalam Django. django.middleware.security.SecurityMiddleware menyediakan beberapa peningkatan keamanan pada siklus request/response. Pilihan check --deploy baru mengizinkan anda untuk memeriksa berkas pengaturan produksi untuk cara meningkatkan keamanan dari situs anda.
Kegunaan khusus PostgreSQL baru¶
Django sekarang mempunyai sebuah modul dengan perpanjangan untuk fitur-fitur khusus PostgreSQL , seperti pencarian ArrayField, HStoreField, Bidang Jangkauan, dan unaccent. Sebuah uraian penuh dari fitur tersedia in the documentation.
Jenis data baru¶
- Django sekarang mempunyai
UUIDFielduntuk menyimpan penciri unik universal. Itu disimpan sebagai jenis darauuidasli di PostgreSQL dan sebagaibidang karakter panjang tetap di backend lain. Ada sebuahform fieldyang sesuai. - Django sekarang mempunyai sebuah
DurationFielduntuk menyimpan periode waktu - model di Python olehtimedelta. Itu disimpan dalam jenis dataintervalasli di PostgreSQL, sebagai sebuahINTERVAL DAY(9) TO SECOND(6)di Oracle, dan sebagaibigintdari mikrodetik di backend lain. Tanggal dan waktu terkait aritmatik juga telah ditingkatkan pada semua backend. Ada sebuahform fieldyang berhubungan.
Query Expressions, Conditional Expressions, dan Database Function¶
Query Expressions mengizinkan anda membuat, menyesuaikan, dan menyusun pernyataan SQL rumit. Ini mempunyai keterangan diadakan untuk menerima pernyataan selaind ari pengumpulan. Pengumpulan sekarang dapat mengacu banyak bidang, sama halnya aritmatika, mirip pada obyek F(). order_by() juga mendapatkan kemampuan menerima pernyataan.
Conditional Expressions mengizinkan anda menggunakan logika if ... elif ... else dalam permintaan.
Sebuah kumpulan dari database functions juga disertakan dengan kegunaan seperti Coalesce, Concat, dan Substr.
Pengaturan data TestCase¶
TestCase telah direfaktor untuk mengizinkan untuk inisialisasi data pada tingkatan kelas menggunakan transaksi dan titik simpan. Backend basisdata yang tidak mendukung transaksi, seperti MySQL dengan penyimpanan MyISAM, akan masih dapat menjalankan percobaan ini tetapi tidak akan bermanfaat dari perbaikan. Percobaan sekarang berjalan dalam dua blok atomic() bersarang: satu untuk keseluruhan kelas dan untuk setiap percobaan.
- Metode kelas
TestCase.setUpTestData()menambah kemampuan untuk mengatur percobaan data pada tingkat kelas. Menggunakan teknik ini dapat mempercepat percobaan seperti dibandingkan untuk menggunakansetUp(). - Fixture loading within
TestCaseis now performed once for the wholeTestCase.
Fitur kecil¶
django.contrib.admin¶
ModelAdminsekarang mempunyai sebuah metodehas_module_permission()untuk mengizinkan membatasi akses pada modul di halaman indeks admin.InlineModelAdminsekarang mempunyai sebuah atributshow_change_linkyang mendukung menampilkan sebuah tautan ke berderet formulir rubah obyek.- Gunakan
django.contrib.admin.RelatedOnlyFieldListFilterbaru diModelAdmin.list_filteruntuk membatasi pilihanlist_filterpada obyek asing yang dilampirkan untuk mereka dariModelAdmin. ModelAdmin.delete_view()menampilkan ringkasan dari obyek untuk dihapus pada jalaman penegasan penghapusan.- Pustaka jQuery tertanam di admin telah ditingkatkan ke versi 1.11.2.
- Anda sekarang dapat menentukan
AdminSite.site_urluntuk menampilkan sebuah tautan ke situs front-end.+ - Anda sekarang dapat menentukan
ModelAdmin.show_full_result_countuntuk mengendalikan apakah atau tidak hitungan penuh obyek harus ditampilkan pada halaman admin tersaring. - Metode
AdminSite.password_change()sekarang mempunyai sebuah parameterextra_context. - Anda sekarang dapat mengendalikan siapa yang dapat masuk ke situs admin dengan menimpa hanya
AdminSite.has_permission()danAdminSite.login_form. Cetakanbase.htmlmempunyai blok baruusertoolsyang mengandung kepala khusus-pengguna. Sebuah variabel konteks baruhas_permission, yang mendapatkan nilainya darihas_permission(), menandakan apakah pengguna dapat mengakses situs. - Dropdown foreign key sekarang mempunyai tombol untuk merubah atau menghapus obyek terkait menggunakan sebuah popup.
django.contrib.admindocs¶
- reStructuredText sekarang diuraikan di model docstring.
django.contrib.auth¶
- Otorisasi backend sekarang dapat memunculkan
PermissionDenieddihas_perm()danhas_module_perms()pada pemeriksaan perizinan sirkit-pendek. PasswordResetFormnow has a methodsend_mail()that can be overridden to customize the mail to be sent.max_lengthdariPermission.nametelah ditingkatkan dari 50 menjadi 255 karakter. Harap jalankan perpindahan basisdata.USERNAME_FIELDdanREQUIRED_FIELDSsekarang mendukungForeignKey- Perhitungan putaran awal untuk pengacak sandi PBKDF2 telah ditingkatkan oleh 33%. Perubahan kesesuaian kebelakang tidak akan mempengaruhi pengguna yang telah disubkelaskan
django.contrib.auth.hashers.PBKDF2PasswordHasheruntuk merubah nilai awal.
django.contrib.gis¶
- GeoJSON serializer baru sekarang tersedia.
- Itu sekarang diizinkan untuk menyertakan sebuah sub permintaan sebagai argumen pencarian geografi, sebagai contoh
City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly')). - Backend SpatiaLite sekarang mendukung pengumpulan
CollectdanExtentketika versi basisdata adalah 3.0 atay terakhir. - Perintah inisialisasi PostGIS 2
CREATE EXTENSION postgisdan the SpatiaLiteSELECT InitSpatialMetaDatasekarang secara otomatis dijalankan olehmigrate. - Antarmuka GDAL sekarang mendukung mengambil sifat dari raster (image) data file.
- Shim kesesuaian untuk
SpatialRefSysdanGeometryColumnsberubah di Django 1.2 telah dipindahkan. - Semua pengecualian terkait-GDAL sekarang dimunculkan dengan
GDALException. PendahuluOGRExceptiontelah disimpan untuk kesesuaian kebelakang tetapi harus tidak digunakan lagi.
django.contrib.sessions¶
- Kue sesi sekarang dihapus setelah
flush()dipanggil.
django.contrib.sitemaps¶
- Atribut
Sitemap.i18nbaru mengizinkan anda untuk membangkitkan sebuah peta situs berdasarkan pada pengaturanLANGUAGES.
django.contrib.sites¶
get_current_site()akan sekarang mencari situs saat ini berdasarkan padarequest.get_host()jika pengaturanSITE_IDtidak ditentukan.- Awalan
Sitedibuat ketika menjalankanmigratesekarang menghormati pengaturanSITE_ID(sebagai gantinya dari selalu menggunakanpk=1).
Tembolok¶
- Metode
incr()dari backenddjango.core.cache.backends.locmem.LocMemCachesekarang thread-safe.
Kriptografi¶
- Parameter
max_agedari metodedjango.core.signing.TimestampSigner.unsign()sekarang juga menerima sebuah obyekdatetime.timedelta.
Backend basisdata¶
- Backend MySQL tidak lagi melucuti mikrodetik dari nilai-nilai
datetimesebagai MySQL 5.6.4 dan mendukung sampai pecahan detik tergantung pada pernyataan dari bidang datetime (ketikaDATETIMEmenyertakan ketelitian pecahan lebih besar dari 0). Kolom basisdata datetime baru dibuat dengan Django 1.8 dan MySQL 5.6.4 dan sampai mendukung mikrodetik. Lihat MySQL database notes untuk rincian lebih. - Backend MySQL tidak lagi dibuat membuat indeks jelas untuk foreign key ketika menggunakan mesin penyimpanan InnoDB. ketika MySQL sudah membuat mereka secara otomatis.
- Backend Oracle tidak lagi menentukan fitur
connection_persists_old_columnssebagaiTrue. Sebagai gantinya, Oracle akan sekarang menyertakan sebuah klausa penghilang cache ketika mendapatkan gambaran.
Surel¶
- Email backends sekarang mendukung protokol pengelola konteks untuk membuka dan menutup hubungan.
- Backend surel SMTP sekarang mendukung otentifikasi
keyfiledancertfiledengan pengaturanEMAIL_SSL_CERTFILEdanEMAIL_SSL_KEYFILE. - SMTP
EmailBackendsekarang mendukung pengaturan parametertimeoutdengan pengaturanEMAIL_TIMEOUT. EmailMessagedanEmailMultiAlternativessekarang mendukung parameterreply_to.
Penyimpanan Berkas¶
Storage.get_available_name()danStorage.save()sekarang mengambil argumenmax_lengthuntuk menerapkan batasan panjang nama berkas maksimal tingkat-penyimpanan. Nama berkas melampaui argumen ini akan dipotong. Ini mencegah kesalahan basisdata ketika menambahkan sebuah akhiran unik pada sebuah nama berkas panjang yang sudah ada di penyimpanan. Lihat deprecation note tentang menambahkan argumen ini ke penyesuaian kelas penyimpanan anda.
Formulir¶
- Widget formulir sekarang membangun atribut dengan nilai dari
TrueatauFalsesebagai atribut boolean HTML5. - Metode
has_error()barumengizinkan pemeriksaan jika kesalahan tertentu terjadi. - Jika
required_css_classditentukan di sebuah formulir, kemudian etiket<label>untuk bidang wajib akan mempunyai kelas ini hadir di atributnya. - Pembangunan dari kesalagan bukan-bidang dalam unordered lists (
<ul>) sekarang menyertakannonfielddalam daftarnya dari kelas-kelas untuk membedakan mereka dari kesalagan bidang-tertentu. Fieldsekarang menerima sebuah argumenlabel_suffix, yang akan menimpalabel_suffixformulir. Ini mengadakan penyesuaian akhiran pada berdasarkan per bidang - sebelumnya itu tidak memungkinkan untuk mengesampingkan sebuahlabel_suffixformulir selagi menggunakan jalan pintas seperti{{ form.as_p }}di cetakan.SelectDateWidgetsekarang menerima sebuah argumenempty_label, yang akan menimpa label pilihan daftar teratas ketikaDateFieldtidak wajib.- Setelah sebuah
ImageFieldtelah dibersihkan dan disahkan, obyekUploadedFileakan mempunyai sebuah tambahan atributimagemengandung instanceImagePillow digunakan untuk memeriksa jika berkas adalah nama sah. Itu juga akan memperbaharuiUploadedFile.content_typedengan jenis isi gambar seperti yang ditentukan oleh Pillow. - Anda dapat sekarang melewatkan callable yang mengembalikan sebuah perulangan dari pilihan ketika membuat obyek
ChoiceField.
Tampilan Umum¶
- Tampilan umum yang menggunakan
MultipleObjectMixinmungkin tidak menentukan urutan berlaku padaquerysetdengan mengaturorderingatau menimpaget_ordering(). - Atribut
SingleObjectMixin.query_pk_and_slugbaru mengizinkan merubah perilaku dariget_object()sehingga itu akan menampilkan pencariannya menggunakan kedua primary key dan keong. - Metode
get_form()tidak membutuhkan sebuahform_classuntuk disediakan lagi. Jika tidak disediakanform_classawalan padaget_form_class(). - Placeholders di
ModelFormMixin.success_urlsekarang mendukung sintaksisstr.format()syntax. The legacy%(<foo>)sPython masih didukung tetapi akan dipindahkan di Django 1.10.
Internasionalisasi¶
FORMAT_MODULE_PATHsekarang dapat berupa sebuah daftar dari string mewakili jalur-jalur modul. Ini mengizinkan mengimpor beberapa bentuk modul dari aplikasi dapat digunakan yang berbeda. Itu juga mengizinkan menimpa bentuk penyesuaian tersebut di proyek Django utama anda.
Pencatatan¶
- Kelas
django.utils.log.AdminEmailHandlersekarang mempunyai sebuah metodesend_mail()untuk membuatnya subkelas lebih ramah.
Pengelolaan perintah¶
- Hubungan basisdata sekarang selalu ditutup setelah perintah pengelolaan dipanggil dari baris perintah telah selesai melakukan pekerjaannya.
- Perintah-perintah dari bentuk paket cara lain seperti eggs sekarang juga ditemukan.
- Pilihan
dumpdata --outputbaru mengizinkan menentukan sebuah berkas yang data diserialisasi ditulis. - Pilihan
makemessages --excludedancompilemessages --excludebaru mengizinkan mengeluarkan lokal tertentu dari pengolahan. compilemessagessekarang mempunyai sebuah pilihan--use-fuzzyatau-fyang menyertakan terjemahan kabur kedalam berkas-berkas tersusun.- Pilihan
loaddata --ignorenonexistentsekarang mengabaikan data untuk model yang tidak lagi ada. runserversekarang menggunakan thread daemon untuk memuat kembali lebih cepat.inspectdbsekarang mengeluarkanMeta.unique_together. Itu juga dapat menginterospeksiAutoFielduntuk basisdata MySQL dan PostgreSQL.- Ketika memanggil perintah pengelolaan dengan pilihan menggunakan
call_command(), nama pilihan dapat mencocokkan nama pilihan baris perintah (tanpa awalan tanda garis) atau nama variabel tujuan pilihan akhir, tetapi dalam kedua kasus, menghasilkan pilihan diterima oleh perintah sekarang selalu namadestditentukan dalam pengertian pilihan perintah (selama perintah menggunakan modulargparse). - Perintah
dbshellsekarang mendukung pilihan pengaturan wewenang sertifikat SSL MySQL (--ssl-ca). makemigrations --namebaru mengizinkan memberikan perpindahan sebuah penyesuaian nama daribada satu yang dibangkitkan.- Perintah
loaddatasekarang mencegah memuat alat bantu berulang. JikaFIXTURE_DIRSmengandung ganda atau jalur direktori alat bantu awalan (app_name/fixtures), sebuah pengecualian dimunculkan. - Pilihan
makemigrations --exitbaru mengizinkan keluar dengan sebuah kode kesalahan jika tidak ada perpindahan dibuat. - Perintah
showmigrationsbaru mengizinkan mendaftarkan semua perpindahan dan ketergantungan mereka dalam sebuah proyek.
Middleware¶
- Atribut
CommonMiddleware.response_redirect_classmengizinkan anda menyesuaikan pengalihan yang diterbitan oleh middleware. - Sebuah pesan pencari kesalahan akan dicatat pada pencatat
django.requestketika middleware memunculkan sebuah pengecualianMiddlewareNotUseddi suasanaDEBUG.
Perpindahan¶
- Operasi
RunSQLsekarang dapat menangani parameter dilewatkan ke pernyataan SQL. - Itu sekarang memungkinkan untuk berpindah (kebanyakan mungkin data migrations) untuk aplikasi tanpa model.
- Perpindahan sekarang dapat serialize model managers sebagai bagian dari keadaan model.
- Sebuah generic mechanism to handle the deprecation of model fields telah ditambahkan.
- Metode/atribut kelas
RunPython.noop()danRunSQL.nooptelah ditambahkan untuk memudahkan dalam pembuatan operasiRunPythondanRunSQLyang dapat dibatalkan. - Operasi perpindahan
RunPythondanRunSQLsekarang memanggil metodeallow_migrate()dari perute basisdata. Perute dapat menggunakan yang baru diperkenalkan argumenapp_labeldanhintsuntuk membuatkeputusan perutean. Untuk mengambil keuntungan dari fitur ini anda butuh memperbaharui ke tanda tanganallow_migratebaru, lihat deprecation section untuk rincian lebih.
Model¶
- Django sekarang mencatat paling 9000 permintaan di
connections.queries, untuk mencegah penggunaan memori terlalu banyak di pengolahan berjalan-lama dalam suasana mencari kesalahan. - Ada sekarang sebuah pilihan
Metamodel untuk menentukan sebuahdefault related nameuntuk semua bidang berhubungan dari sebuah model. - Model pickling dan queryset lintas versi berbeda dari Django tidak secara resmi didukung (itu mungkin bekerja, tetapi tidak ada jaminan). Sebuah variabel tambahan yang menentukan versi Django saat ini sekarang ditambahkan ke keadaan pickel dari model dan queryset, dan Django memunculkan sebuah
RuntimeWarningketika obyek-obyek ini tidak di pickle dalam versi berbeda daripada satu yang mereka telah di pickle. - Ditambahkan
Model.from_db()dimana pengguna Django menggunakan kapanpun obyek-obyek dimuat menggunakan ORM. Metode ini mengizinkan menyesuaikan perilaku memuat model. extra(select={...})sekarang mengizinkan anda untuk meloloskan urutan%sharfiah menggunakan%%s.- Custom Lookups sekarang dapat didaftarkan menggunakan pola penghias.
- Atribut
Transform.bilateralbaru mengizinkan membuat perubahan timbal balik. Terjemahan ini diberlakukan pada kedualhsdanrhsketika digunakan dalam pernyataan pencarian, menyediakan kesempatan untuk pencarian lebih mutakhir. - Karakter khusus SQL (, %, _) sekarang diloloskan dengan benar ketika pencarian pola (sebagai contoh
contains,startswith, dll.) digunakan dengan sebuah ungkapanF()sebagai sisi tangan-kanan. Di kasus-kasus tersebut, pelolosan dilakukan oleh basisdata, yang dapat membawa ke permintaan agak rumit melibatkan pemanggilan fungsiREPLACEbersarang. - Anda sekarang dapat menyegarkan instance model dengan menggunakan
Model.refresh_from_db(). - Anda sekarang dapat mendapatkan setelan dari bidang-bidang yang ditunda untuk sebuah model menggunakan
Model.get_deferred_fields(). - Bidang model
defaultini sekarang digunakan ketika bidang primary key disetel menjadiNone.
Sinyal¶
- Pengecualian dari tuple
(receiver, exception)dikembalikan olehSignal.send_robust()sekarang mempunyai melacak kembali dilampirkan sebagai atribut __traceback__`. - Argumen
environ, yang mengandung struktur lingkungan WSGI dari permintaan, telah ditambahkan ke sinyalrequest_started. - Anda sekarang dapat mengimpor sinyal
setting_changed()daridjango.core.signalsuntuk menghindari memuatdjango.testdi keadaan bukan-percobaan. Django tidak lagi melalukannya sendiri.
Templat¶
urlizesekarang mendukung tautan hanya-ranah yang menyertakan karakter setelah ranah tingkat-atas (sebagai contohdjangoproject.com/dandjangoproject.com/download/).urlizetidak memperlakukan tanda seruan pada akhir dari sebuah ranah atau string permintaannya sebagai bagian dari URL ( URL di sebagai contoh'djangoproject.com!adalahdjangoproject.com)- Ditambahkan sebuah kelas
locmem.Loaderyang memuat cetakan Django dari sebuah kamus Python. - Etiket
nowsekarang dapat menyimpan keluarannya di variabel konteks dengan sintaksis biasa:{% sekarang 'j n Y' sebagai varname %}.
Permintaan dan Tanggapan¶
WSGIRequestsekarang menghormati jalur dimulai dengan//.- Metode
HttpRequest.build_absolute_uri()sekarang menangani jalur dimulai dengan tepat//. - Jika
DEBUGadalahTruedan sebuah permintaan memunculkan sebuahSuspiciousOperation, tanggapan akan dibangun dengan halaman kesalahan rinci. - Argumen
query_stringdariQueryDictsekarang pilihan, awalan keNone, jadiQueryDictkosong sekarang dapat di instansiasikan denganQueryDict()sebagai gantinyaQueryDict(None)atauQueryDict(''). - Atribut
GETdanPOSTdari sebuah obyekHttpRequestsekarangQueryDictdaripada kamus, dan atributFILESsekarang sebuahMultiValueDict. Ini membawa kelas ini kedalam baris dengan dokumentasi dan denganWSGIRequest. - Atribut
HttpResponse.charsettelah ditambahkan WSGIRequestHandlersekarang mengikuti RFC dalam merubah URI menjadi IRI, menggunakanuri_to_iri().- Metode
HttpRequest.get_full_path()sekarang meloloskan karakter tidak aman dari bagian jalur dari sebuah Uniform Resource Identifier (URI) dengan benar. HttpResponsesekarang menerapkan sedikit tambahan motode sepertigetvalue()sehingga instance dapat digunakan sebagai obyek aliran.- Metode
HttpResponse.setdefault()baru mengizinkan mengatur sebuah kepala meskipun itu sudah disetel. - Anda dapat menggunakan
FileResponsebaru pada berkas aliran. - Penghias
condition()untuk pengolahan tampilan bersyarat sekarang mendukung kepalaIf-unmodified-since.
Pengujian¶
- Metode
RequestFactory.trace()danClient.trace()diterapkan, mengizinkan anda membuat permintaanTRACEdi percobaan anda. - Argumen
counttelah ditambahkan keassertTemplateUsed(). Ini mengizinkan anda untuk menegaskan bahwa sebuah cetakan telah membangun sejumlah kali tertentu. - Penegasan
assertJSONNotEqual()baru mengizinkan anda mencoba yang dua fragmen JSON tidak setara. - Ditambahkan pilihan pada perintah
testuntuk mempertahankan basisdata percobaan (--keepdb), untuk menjalankan percobaan-percobaan kasus dalam urutan terbalik (--reverse), dan untuk mengadakan pencatatan SQL untuk kegagalan percobaan (--debug-sql). - Ditambahkan atribut
resolver_matchpada mencoba tanggapan klien - Ditambahkan beberapa pengaturan yang mengizinkan penyesuaian dari parameter tablespace percobaan untuk Oracle:
DATAFILE,DATAFILE_TMP,DATAFILE_MAXSIZEdanDATAFILE_TMP_MAXSIZE. - Penghias
override_settings()sekarang dapat mempengaruhi rute master dalamDATABASE_ROUTERS. - Ditambahkan dukungan klien percobaan untuk unggahberkas dengan obyek seperti-berkas.
- Sebuah cache berbagi sekarang digunakan ketika dicoba dengan sebuah basisdata di-memori SQLite ketika menggunakan Python 3.4+ dan SQLite 3.7.13+. Ini mengizinkan berbagi basisdata diantara thread.
Pengesah¶
URLValidatorsekarang mendukung alamat IPv6, ranah unicode, dan URL mengandung data otentifikasi.
Perubahan bertentangan kebelakang di 1.8¶
Peringatan
Sebagai tambahan pada perubahan diuraikan dalam bagian ini, pastikan meninjau kembali deprecation plan untuk setiap fitur-fitur yang telah dipindahkan. Jika anda belum memperbaharui kode anda dalam linimasa pengusangan untuk fitur yang diberikan, perpindahannya mungkin muncul sebagai sebuah perubahan tidak sesuai kebelakang.
Menugaskan obyek tidak tersimpan pada hubungan memunculkan sebuah kesalahan¶
Catatan
Untuk lebih mudah mengizinkan penggunaan dalam-memori dari model, perubahan ini telah dikembalikan di Django 1.8.4 dan diganti dengan pemeriksaan selama model.save(). Sebagai contoh:
>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.save()
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'.
Pemeriksaan mirip pada penugasan untuk membalikkan hubungan one-to-one telah dipindahkan di Django 1.8.5.
Menugaskan obyek tidak tersimpan pada sebuah ForeignKey, GenericForeignKey, dan OneToOneField sekarang memunculkan ValueError.
Sebelumnya, penugasan dari obyek tidak disimpan dapat secara diam diabaikan. Sebagai contoh:
>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()
>>> Book.objects.get(name="Django")
>>> book.author
>>>
Sekarang, sebuah kesalahan akan muncul untuk mencegah kehilangan data:
>>> book.author = Author(name="john")
Traceback (most recent call last):
...
ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.
Jika anda membutuhkan mengizinkan penugasan dari instance tidak disimpan (perilaku lama) dan tidak khawatir tentang kemungkinan kehilangan data (sebagai contoh anda tidak pernah menyimpan obyek-obyek ke basisdata), anda dapat meniadakan pemeriksaan ini dengan menggunakan atribut ForeignKey.allow_unsaved_instance_assignment. (Atribut ini telah dipindahkan di 1.8.4 ketika itu tidak lagi bersangkut paut.)
Perintah pengelolaan yang hanya menerima argumen penempatan¶
Jika anda telah menulis sebuah penyesuaian perintah pengelolaan yang hanya menerima argumen penempatan dan anda tidak menentukan variabel perintah args, anda mungkin mendapatkan sebuah kesalahan seperti Error: unrecognized arguments: ..., ketika penguraian variabel sekarang berdasarkan pada argparse yang tidak secara langsung menerima argumen penempatan. Anda dapat membuat perintah kesesuaian kebelakang anda dengan cukup mengatur variabel kelas args. Bagaimanapun, jika anda tidak harus menhaga kesesuaian dengan versi Django terlama, itu adalah lebih baik menerapkan metode add_arguments() baru seperti digambarkan di Menulis perintah django-admin penyesuaian.
Penyesuaian argumen perintah pengelolaan percobaan melalui pejalan percobaan¶
Metode untuk menambah penyesuaian argumen pada perintah pengelolaan test melalui pejalan percobaan telah berubah. Sebelumnya, anda dapat menyediakan sebuah variabel kelas option_list pada pejalan percobaan untuk menambah argumen lebih (à la optparse). Sekarang menerapkan perilaku lama, anda telah membuat sebuah metode kelas add_arguments(cls, parser) dan memanggil parser.add_argument untuk menambahkan setiap penyesuaian argumen, sebagai pengurai adalah sekarang sebuah instance argparse.ArgumentParser.
Pemeriksaan model memastikan nama-nama kolom dibangkitkan-otomatis dalam batasan ditentukan oleh basisdata.¶
Nama bidang yang tidak lebih panjang dari panjang nama kolom didukung oleh sebuah basisdata dapat membuat masalah. Sebagai contoh, dengan MySQL anda akan mendapatkan sebuah pengecualian mencoba membuat kolom, dan dengan PostgreSQL nama kolom dipotong oleh basisdata (anda mungkin melihat sebuah peringatan di catatan PostgreSQL).
Sebuah pemeriksaan model telah diperkenalkan untuk memperingati lebih baik pengguna pada skenario ini sebelum pembuatan sebenarnya dari tabel-tabel basisdata.
Jika anda mempunyai sebuah model yang ada dimana pemeriksaan ini kelihatan positif salah, sebagai contoh di PostgreSQL dimana nama sudah sedang dipotong, cukup menggunakan db_column untuk menentukan nama yang sedang digunakan.
Pemeriksaan juga berlaku pada kolom dibangkitkan dalam sebuah model ManyToManyField.through yang tersirat. Jika anda berjalan kedalam sebuah masalah disana, gunakan through untuk membuat sebuah model yang jelas dan kemudian tentukan db_column di kolomnya sesuai kebutuhan.
Pencarian hubungan permintaan sekarang memeriksa jenis-jenis obyek¶
Meminta untuk pencarian model sekarang diperiksa jika obyek diloloskan adalah jenis benar dan memunculkan sebuah ValueError jika tidak. Sebelumnya, Django tidak peduli jika objek adalah jenis benar; itu cukup menggunakan atribut bidang terkait objek (sebagai contoh id) untuk pencarian. Sekarang, sebuah kesalahan dimunculkan untuk mencegah pencarian tidak benar:
>>> book = Book.objects.create(name="Django")
>>> book = Book.objects.filter(author=book)
Traceback (most recent call last):
...
ValueError: Cannot query "<Book: Django>": Must be "Author" instance.
EmailField.max_length awal ditingkatkan menjadi 254¶
Karakter 75 awalan lama max_length tidak dapat menyimpan semua kemungkinan alamat surel RFC3696/5321-compliant. Untuk menyimpan semua kemungkinan alamat surel sah, max_length telah ditingkatkan menjadi 254 karakter. Anda akan butuh membangkitkan dan memberlakukan perpindahan basisdata untuk model yang anda terpengaruh (atau tambah max_length=75 jika anda berharap menjaga panjang di bidang-bidang anda saat ini). Sebuah perpindahan untuk django.contrib.auth.models.User.email disertakan.
Mendukung untuk PostgreSQL versi lebih lama dari 9.0¶
Akhir dari masa dukungan hulu telah sampai di Juli 2014 untuk PostgreSQL 8.4. Sebagai konsekuensinya, Django 1.8 menyetel 9.0 sebagai versi PostgreSQL minimal dia secara resmi dukung.
Ini juga menyertakan penjatuhan dukungan untuk PostGIS 1.3 and 1.4 ketika versi ini tidak didukung pada versi PostgreSQL terakhir daripada 8.4.
Django juga sekarang membutuhkan menggunakan Psycopg2 versi 2.4.5 atau lebih tinggi (atau 2.5+ jika anda ingin menggunakan django.contrib.postgres).
Mendukung untuk MySQL versi lebih lama dari 5.5¶
Akhir dari masa dukungan hulu telah sampai di Januari 2012 untuk MySQL 5.0 dan Desember 2013 untuk MySQL 5.1. Sebagai konsekuensinya, Django 1.8 menyetel 5.5 sebagai versi MySQL minimal dia secara resmi dukung.
Mendukung untuk Oracle versi lebih lama dari 11.1¶
Akhir dari masa dukungan hulu telah sampai di Juli 2010 untuk Oracle 9.2, Januari 2012 untuk Oracle 10.1, dan Juli 2013 untuk Oracle 10.2. Sebagai konsekuensinya, Django 1.8 menyetel 11.1 sebagai versi Oracle minimal dia secara resmi dukung.
Hak khusus digunakan daripada peran untuk percobaan di Oracle¶
Versi awal dari Django memberikan peran CONNECT dan RESOURCE pada pengguna percobaan di Oracle. Peran-peran ini telah diusangkan, jadi Django 1.8 menggunakan hak pokok khusus. Perubahan dari hak memwajibkan pengguna utama untuk menjalankan percobaan (meskipun proyek dikonfigurasikan untuk menghindari membuat sebuah pengguna percobaan). Hak tepat mewajibkan sekarang dirinci dalam Oracle notes.
AbstractUser.last_login selalu bernilai null¶
Bidang AbstractUser.last_login sekarang mengizinkan nilai null. Sebelumnya, itu diawalkan pada waktu ketika pengguna membuat yang menyesatkan jika pengguna tidak pernah masuk. Jika anda sedang menggunakan pengguna awalan (django.contrib.auth.models.User), jalankan perpindahan basisdata disertakan di contrib.auth.
Jika anda sedang menggunakan penyesuaian model pengguna yang mewarisi dari AbstractUser, anda akan butuh menjalankan makemigrations dan membangkitkan sebuah perpindahan untuk aplikasi anda yang mengandung model itu. Juga, jika berharap menyetel last_login menjadi NULL untuk pengguna yang belum masuk, anda dapat menjalankan permintaan ini:
from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser
UserModel = get_user_model()
if issubclass(UserModel, AbstractBaseUser):
UserModel._default_manager.filter(
last_login=models.F('date_joined')
).update(last_login=None)
django.contrib.gis¶
- Dukungan untuk GEOS 3.1 dan GDAL 1.6 telah dibuang.
- Dukungan untuk SpatiaLite < 2.4 telah dibuang.
- Pencarian khusus-GIS telah direfaktorisasi untuk menggunakan API
django.db.models.Lookup. - Objek
strrepresentation ofGEOSGeometryawalan telah berubah dari bentuk WKT menjadi EWKT (termasuk SRID). Ketika perwakilan ini digunakan dalam kerangka kerja serialisasi, itu berarti bahwa keluarandumpdataakan sekarang mengandung nilai SRID dari obyek geometri.
Prioritas dari pengolah konteks untuk TemplateResponse membawa sebaris dengan render¶
Pembangun TemplateResponse dirancang menjadi pengganti singgah untuk fungsi render(). Bagaimanapun, itu mempunyai sedikit ketidaksesuaian, bahwa untuk TemplateResponse, data konteks dari melewatkan di kamus konteks dapat dibayangi oleh data konteks dikembalikan dari pengolah konteks, sedangkan untuk render itu adalah cara lain. Ini adalah sebuah kesalahan, dan perilaku dari render lebih sesuai, sejak itu mengizinkan secara global menentukan pengolah konteks untuk menjadi dikesampingkan secara lokal di tampilan. Jika anda mengandalkan pada kenyataan data konteks di TemplateResponse dapat dikesampingkan menggunakan pengolah konteks, anda akan butuh merubah kode anda.
Menimpa setUpClass / tearDownClass di kasus-kasus percobaan¶
Penghias override_settings() dan modify_settings() sekarang bertindak pada tingkat kelas ketika digunakan sebagai penghias kelas. Sebagai konsekuensi, ketika menimpa setUpClass() atau tearDownClass(), penerapan super harus selalu dipanggil.
Pemindahan django.contrib.formtools¶
Aplikasi bantuan formtool telah dipindahkan untuk memisahkan paket dan halaman dokumentasi yang bersangkut-paut telah diperbaharui atau dipindahkan.
Paket baru tersedia di GitHub dan di PyPI.
Memuat kembali hubungan basisdata diantara percobaan¶
Django sebelumnya menutup hubungan basisdata diantara setiap percobaan dalam sebuah TestCase. Ini tidak lagi kasus sebagai Django sekarang membungkus keseluruhan TestCase dalam sebuah transaksi. Jika beberapa percobaan anda bergantung pada perilaku lama, anda harus memiliki mereka mewarisi dari TransactionTestCase sebagai gantinya.
Membersihkan namescpace django.template¶
Jika anda telah mengandalkan pada API pribadi diungkap dalam modul django.template, anda mungkin harus mengimpor mereka dari django.template.base sebagai gantinya.
Juga pribadi API django.template.base.compile_string(), django.template.loader.find_template(), dan django.template.loader.get_template_from_string() dipindahkan.
Atribut model pada hubungan model pribadi¶
Di versi paling awal dari Django, pada model dengan hubungan lintas foreign key (sebagai contoh), model._meta.get_all_related_objects() mengembalikan hubungan sebagai sebuah django.db.models.related.RelatedObject dengan atribut model disetel ke sumber dari hubungan. Sekarang, metode ini mengembalikan hubungan sebagai django.db.models.fields.related.ManyToOneRel (API pribadi RelatedObject telah dipindahkan), dan atribut model distel ke sasaran dari hubungan daripada sumber. Sumber model adalah dapat diakses pada atribut related_model sebagai gantinya.
Pertimbangkan contoh ini dari tutorial di Django 1.8:
>>> p = Poll.objects.get(pk=1)
>>> p._meta.get_all_related_objects()
[<ManyToOneRel: polls.choice>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Poll'>
>>> p._meta.get_all_related_objects()[0].related_model
<class 'polls.models.Choice'>
dan bandingkan dia pada perilaku versi lama:
>>> p._meta.get_all_related_objects()
[<RelatedObject: polls:choice related to poll>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Choice'>
Untuk mengakses model sumber, anda dapat menggunakan pola seperti ini untuk menulis kode yang akan bekerja dengan kedua Django 1.8 dan versi terlama:
for relation in opts.get_all_related_objects():
to_model = getattr(relation, 'related_model', relation.model)
Juga catat bahwa get_all_related_objects() diusangkan di 1.8. Lihat upgrade guide untuk API baru.
API backend basisdata¶
Perubahan berikut pada API backend basisdata didokumentasikan untuk memandu penulisan backend pihak-ketiga tersebut dalam memperbaharui kode mereka.
Kelas-kelas
BaseDatabaseXXXtelah dipindahkan kedjango.db.backends.base. Harap mengimpor mereka dari tempat baru:from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.base.features import BaseDatabaseFeatures from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.base.introspection import FieldInfo, TableInfo from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.base.validation import BaseDatabaseValidation
Atribut
data_types,data_types_suffix, dandata_type_check_constraintstelah dipindahkan dari kelasDatabaseCreationkeDatabaseWrapper.Metode
SQLCompiler.as_sql()sekarang mengambil sebuah parametersubquery(#24164).Metode
BaseDatabaseOperations.date_interval_sql()sekarang hanya mengambil parametertimedelta.
django.contrib.admin¶
AdminSitetidak lagi mengambil sebuah argumenapp_namedan atributapp_namenya telah dipindahkan. Nama Aplikasi selaluadmin(sebagai lawan pada nama instance yang anda dapat masih sesuaikan menggunakanAdminSite(name="...").- Metode
ModelAdmin.get_object()(API pribadi) sekarang mengambil argumen ketiga bernamafrom_fielduntuk menentukan bidang mana harus cocok denganobject_idyang disediakan. - Metode
ModelAdmin.response_delete()sekarang mengambil argumen kedua bernamaobj_idyang merupakan penciri serialisasi digunakan untuk mengambil obyek sebelum penghapusan.
Pelolosan otomatis awalan dari fungsi di django.template.defaultfilters¶
Untuk membuat penyaring siap-pakai yang mengeluarkan HTML "safe by default" ketika memanggil mereka di kode Python, fungsi berikut di django.template.defaultfilters telah berubah menjadi pelolosan otomatis nilai masukan mereka:
joinlinebreaksbrlinebreaks_filterlinenumbersunordered_listurlizeurlizetrunc
Anda dapat kembali ke perilaku lama dengan menentukan autoescape=False jika anda sedang melewatkan isi yang dipercaya. Perubahan ini tidak mempunyai pengaruh apapun ketika menggunakan penyaring sesuai di cetakan.
Bermacam-macam¶
connections.queriesadalah sekarang sebuah atribut hanya-baca.Hubungan basisdata dipertimbangkan sama hanya jika mereka obyek yang sama. Mereka tidak dapat diacak lagi.
GZipMiddlewaredigunakan untuk meniadakan pemampatan untuk beberapa jenis isi ketika permintaan dari Internet Explorer, agar memecahkan sebuah kesalahan di IE6 dan paling awal. Perilaku ini dapat mempengaruhi penampilan pada IE7 dan terakhir. Itu telah dipindahkan.URLField.to_python` tidak lagi menambah sebuah buntutuan garis miring pada URL tidak berjalur.
Penyaring cetakan
lengthsekarang mengembalikan0untuk sebuah variabel tidak ditentukan, daripada sebuah string kosong.ForeignKey.default_error_message['invalid']telah berubah dari'%(model)s instance with pk %(pk)r does not exist.'menjadi'%(model)s instance with %(field)s %(value)r does not exist.'Jika anda menggunakan pesan ini di kode anda sendiri, harap memperbaharui daftar dari parameter yang disisipkan. Secara internal, Django akan melanjutkan menyediakan parameterpkdiparamsuntuk kesesuaian kebelakang.UserCreationForm.error_messages['duplicate_username']tidak digunakan lagi. Jika anda berharap menyesuaikan pesan kesalahan itu, override it on the form menggunakan kunci'unique'diMeta.error_messages['username']atau, jika anda mempunyai bidang formulir penyesuaian untuk'username', menggunakan kunci'unique'di argumenerror_messagesnya.Blok
usertoolsdi cetakanbase.htmldaridjango.contrib.adminsekarang membutuhkan variabel kontekshas_permissionuntuk disetel. Jika anda mempunyai tampilan admin penyesuaian apapun yang menggunakan cetakan ini, perbaharui mereka untuk melewatkanAdminSite.has_permission()ketika nilai variabel ini atau cukup menyertakanAdminSite.each_context(request)di konteks.Perubahan internal dibuat pada widget
ClearableFileInputuntuk mengizinkan penyesuaian lebih. Atributurl_markup_templatetidak terdokumentasi telah dipindahkan dalam mendukungtemplate_with_initial.Untuk ketetapan dengan penjaja utama lain, lokal
en_GBsekarang mempunyai Sennin sebagai hari pertama dari minggu.Kedua telah dipindahkan dari lokal apapun yang memiliki mereka di
TIME_FORMAT,DATETIME_FORMAT, atauSHORT_DATETIME_FORMAT.Ukuran maksimal awalan dari tablespace percobaan Oracle telah ditingkatkan dari 300 M (atau 200M, sebelum 1.7.2) menjadi 500M.
reverse()danreverse_lazy()sekarang mengembalikan string Unicode daripada string byte.Shim
CacheClasstelah dipindahkan dari semua backend cache. Nama lain ini disediakan untuk kesesuaian kebelakang dengan Django 1.3. Jika anda masih menggunakan mereka, harap perbaharui proyek anda untuk menggunakan nama kelas sebenarnya ditemukan di kunciBACKENDdari pengaturanCACHES.Secara awalan,
call_command()sekarang selalu melewati pemeriksaan kerangka kerja (meskipun anda melewatkan ituskip_checks=False).Ketika mengulang terhadap baris,
Filesekarang menggunakan universal newlines. Berikut dikenali sebagai akhiran sebuah baris: kebiasaan akhir-baris Unix'\n', kebiasaan Windows'\r\n', dan kebiasaan Macintosh lama'\r'.Backend cache memcache
MemcachedCachedanPyLibMCCacheakan menghapus sebuah kunci jikaset()gagal. Ini diperlukan untuk memastikan penyimpanan sesicache_dbselalu mengambil data sesi paling saat ini.API pribadi
override_template_loadersdanoverride_with_test_loaderdidjango.test.utilstelah dipindahkan. MenimpaTEMPLATESdenganoverride_settingssebagai gantinya.Peringatan dari backend basisdata MySQL tidak lagi dirubah ke pengecualian ketika
DEBUGadalahTrue.HttpRequestsekarang telah disederhanakanrepr(sebagai contoh<WSGIRequest: GET '/somepath/'>). Ini tidak akan merubah perilaku dari kelasSafeExceptionReporterFilter.Tampilan berdasarkan-kelas yang menggunakan
ModelFormMixinakan memunculkan sebuah pengecualianImproperlyConfiguredketika kedua atributfieldsdanform_classditentukan. Sebelumnya,fieldssecara diam diabaikan.Ketika mengikuti pengalihan, klien percobaan sekarang memunculkan
RedirectCycleErrorjika itu mengetahui perulangan atau menegai batasan pengalihan maksimal (daripada kemudian melewatkan secara diam).Deretan karakter dapat diartikan sebagai parameter
defaultdari bidang adalah dimasukkan ke deretan karakter berwujud terakhir, jadi jenis kembalian dariField.get_default()berbeda di beberapa kasus. Tidak ada perubahan pada nilai awalan yang merupakan hasil dari callable.GenericIPAddressField.empty_strings_allowedsekarangFalse. Backend basisdata yang mengartikan string kosong sebagai null (hanya Oracle diantara backend yang Django sertakan) akan tidak lagi merubah nilai null kembali ke string kosong. Ini adalah ketetapan dengan backend lain.Ketika atribut
leave_locale_aloneadalahFalse, terjemahan sekarang dinonaktifkan daripada memaksa lokal "en-us". Dalam kasus model anda mengandung string bukan-Inggris dan anda terhitung pada terjemahan Inggris untuk diaktifkan dalam perintah pengelolaan, ini tidak akan terjadi lagi. Itu mungkin bahwa perpindahan basisdata baru dibangkitkan (sekali) setelah perpindahan pada 1.8.django.utils.translation.get_language()sekarang mengembalikanNonedaripadaLANGUAGE_CODEketika terjemahan secara sementara dinonaktifkan.Ketika sebuah terjemahan tidak ada untuk harfiah tertentu, fallback sekarang diambil dari bahasa
LANGUAGE_CODE(daripada dari pesanmsidtidak diterjemahkan).Bidang
namedaridjango.contrib.contenttypes.models.ContentTypetelah dipindahkan dengan perpindahan dan diganti oleh sebuah sifat. Itu berarti itu tidak memungkinkan untuk meminta atau menyaring sebuahContentTypedengan bidang ini lagi.Hati-hati jika anda meningkatkan ke Django 1.8 dan melewati Django 1.7. Jika anda menjalankan
manage.py migrate --fake, perpindahan ini akan dilewatkan dan anda akan melihat sebuah pengecualianRuntimeError: Error creating new content types.karena kolomnametidak akan dibuang dari basisdata. Gunakanmanage.py migrate --fake-initialuntuk meniru hanya perpindahan awalan sebagai gantinya.Pilihan
migrate --fake-initialbaru mengizinkan perpindahan inisial tiruan, Di 1.7, inisial perpindahan selalu secara otomatis tiruan jika semua tabel dibuat di inisial perpindahan sudah ada.Sebuah aplikasi tanpa perpindahan dengan
ForeignKeypada sebuah aplikasi dengan perpindahan mungkin sekarang hasil di kesalahanbatasan foreign key ketika memindahkan basisdata atau menjalankan percobaan. Di Django 1.7, ini dapat gagal secara diam dan kembali di batasan hilang. Untuk mengatasi kesalahan, tambah perpindahan pada aplikasi tanpa mereka.
Fitur diusangkan di 1.8¶
Metode terpilih di django.db.models.options.Options¶
Sebagai bagian dari perumusan dari API Model._meta (dari kelas django.db.models.options.Options), sejumlah metode telah diusangkan dan akan dipindahkan di Django 1.10:
get_all_field_names()get_all_related_objects()get_all_related_objects_with_model()get_all_related_many_to_many_objects()get_all_related_m2m_objects_with_model()get_concrete_fields_with_model()get_field_by_name()get_fields_with_model()get_m2m_with_model()
Sebuah migration guide telah disediakan untuk memandu dalam merubah kode anda dari API lama ke baru, API resmi.
Memuat etiket cetakan cycle dan firstof dari pustaka future¶
Django 1.6 memperkenalkan sintaksis {% load cycle from future %} dan {% load firstof from future %} untuk kesesuaian kedepan dari etiket cetakan cycle dan firstof. Sintaksis ini sekarang diusangkan dan akan dipindahkan di Django 1.10. Anda dapat cukup memindahkan etiket {% load ... from future %}.
django.conf.urls.patterns()¶
Di haru dahulu dari Django, itu didorong untuk mengacukan tampilan sebagai string di urlpatterns:
urlpatterns = patterns('',
url('^$', 'myapp.views.myview'),
)
dan Django secara ajaib akan mengimpor myapp.views.myview secara internal dan merubah string kedalam acuan fungsi sebenarnya. Untuk mengurangi perulangan ketika mengacu banyak tampilan dari modul yang sama, fungsi patterns() mengambil argumen prefix awal yang diwajibkan yang ditambahkan ke semua tampilan-sebagai-string di kumpulan dari urlpatterns itu:
urlpatterns = patterns('myapp.views',
url('^$', 'myview'),
url('^other/$', 'otherview'),
)
Di era modern, kami telah memperbaharui tutorial daripada menganjurkan modul tampilan anda dan mengacu fungsi tampilan anda (atau kelas-kelas) secara langsung. Ini mempunyai sejumlah keuntungan, semua berasal dari kenyataan bahwa kami sedang menggunakan Python biasa dalam menempatkan "Django String Magic": kesalahan-kesalahan ketika anda salah ketik sebuah nama tampilan adalah sedikit mengaburkan, IDE dapat membantu dengan pelengkapan otomatis dari nama-nama tampilan, dll.
Jadi hari ini, yang diatas menggunakan argumen prefix jauh lebih mungkin untuk ditulis (dan lebih baik ditulis) sebagai:
from myapp import views
urlpatterns = patterns('',
url('^$', views.myview),
url('^other/$', views.otherview),
)
Dengan demikian patterns() melayani sedikit tujuan dan adalah sebuah tanggunan ketika mengajarkan pengguna baru (menjawab pertanyaan baru "mengapa Saya butuh string kosong ini sebagai argumen pertama pada patterns()?"). Untuk alasan ini, kami sedang mengusangkan itu. Memperbaharui kode anda adalah semudah memastikan bahwa urlpatterns adalah sebuah daftar dari instance django.conf.urls.url(). Sebagai contoh:
from django.conf.urls import url
from myapp import views
urlpatterns = [
url('^$', views.myview),
url('^other/$', views.otherview),
]
Melewatkan sebuah string sebagai view pada url()¶
Terkait pada barang sebelumnya, mengacu tampilan sebagai sting di fungsi url() adalah diusangkan. Lewatkan tampilan dapat dipanggil seperti digambarkan di bagian sebelumnya sebagai gantinya.
django.core.context_processors¶
Pengolah konteks cetakan siap-pakai telah dipindahkan ke django.template.context_processors.
django.test.SimpleTestCase.urls¶
Atribut SimpleTestCase.urls untuk menentukan konfigurasi URLConf dalam percobaan telah diusangkan dan akan dipindahkan di Django 1.10. Gunakan @override_settings(ROOT_URLCONF=...) sebagai gantinya.
Argumen prefix pada i18n_patterns()¶
Terkait pada barang sebelumnya, argumen prefix pada django.conf.urls.i18n.i18n_patterns() telah diusangkan. Cukup melewatkan sebuah daftar dai instance django.conf.urls.url() sebagai gantinya.
Menggunakan hitungan tidak benar dari nilai dibongkar di etiket cetakan for¶
Menggunakan sebuah hitungan tidak benar dari nilai dibongkar dalam etiket for akan memunculkan sebuah pengecualian daripada gagal secara diam di Django 1.10.
Melewatkan jalur bertitik ke reverse() dan url¶
Membalikkan URL dengan jalur Python adalah sebuah tindakan yang mahal karena itu menyebabkan jalur menjadi berbalik untuk diimpor. Perilaku ini juga dihasilkan di security issue. Gunakan named URL patterns untuk membalikkan sebagai gantinya.
Jika anda sedang menggunakan django.contrib.sitemaps, tambah argumen name ke url yang mengacu django.contrib.sitemaps.views.sitemap():
from django.contrib.sitemaps.views import sitemap
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap')
untuk memastikan kesesuaian ketika membalikkan oleh jalur Python dipindahkan di Django 1.10.
Serupa untuk peta situs GIS, tambah name='django.contrib.gis.sitemaps.views.kml' atau name='django.contrib.gis.sitemaps.views.kmz'.
Jika anda sedang menggunakan jalur Python untuk pengaturan LOGIN_URL atau LOGIN_REDIRECT_URL, gunakan nama dari url() sebagai gantinya.
Metode dan modul pengumpulan¶
Modul django.db.models.sql.aggregates dan django.contrib.gis.db.models.sql.aggregates (kedua API pribadi), telah diusangkan sebagai django.db.models.aggregates dan django.contrib.gis.db.models.aggregates sekarang juga bertanggungjawab untuk pembangkitan SQL. Modul lama akan dipindahkan di Django 1.10.
Jika anda sedang menggunakan modul lama, lihat Query Expressions untuk petunjuk pada penulisan kembali pengumpulan penyesuaian menggunakan API stabil baru.
Metode berikut dan sifat dari django.db.models.sql.query.Query juga telah diusangkan dan shim kesesuaian kebelakang akan dipindahkan di Django 1.10:
Query.aggregates, diganti olehannotations.- Query.aggregate_select`, diganti oleh
annotation_select. Query.add_aggregate(), diganti olehadd_annotation().Query.set_aggregate_mask(), diganti olehset_annotation_mask().Query.append_aggregate_mask(), diganti olehappend_annotation_mask().
Memperpanjang argumen perintah pengelolaan melalui Command.option_list¶
Perintah pengelolaan sekarang menggunakan argparse sebagai gantinya optparse untuk mengurai argumen baris-perintah dilewatkan ke perintah. Ini juga berarti bahwa cara untuk menambah argumen penyesuaian pada perintah telah berubah: daripada memperpanjang daftar kelas option_list, anda sekarang harus menimpa metode add_arguments() dan menambah argumen melalui argparse.add_argument(). Lihat this example untuk lebih rinci.
django.core.management.NoArgsCommand¶
Kelas NoArgsCommand sekarang diusangkan dan akan dipindahkan di Django 1.10. Gunakan BaseCommand sebagai gantinya, yang mengambil tidak ada argumen secara awal.
Mendaftarkan semua perpindahan di sebuah proyek¶
Pilihan --list dari perintah pengelolaan migrate telah diusangkan dan akan dipindahkan di Django 1.10. Gunakan showmigrations sebagai gantinya.
Pilihan cache_choices dari ModelChoiceField dan ModelMultipleChoiceField¶
ModelChoiceField dan ModelMultipleChoiceField mengambil sebuah tidak terdokumentasi, cache_choices pilihan tidak dicoba. Ini menyimpan queryset diantara pembangunan banyak dari obyek Form yang sama. Pilihan ini adalah subjek pada pengusangan yang dipercepat dan akan dipindahkan di Django 1.9.
django.template.resolve_variable()¶
Fungsi ini telah secara tidak resmi ditandai sebagai "Deprecated" untuk beberapa waktu. Ganti resolve_variable(path, context) dengan django.template.Variable(path).resolve(context).
django.contrib.webdesign¶
Itu menyediakan etiket cetakan lorem yang sekarang disertakan di etiket siap-pakai. Cukup pindahkan 'django.contrib.webdesign' dari INSTALLED_APPS dan {% load webdesign %} dari cetakan anda.
error_message argumen ke django.forms.RegexField¶
Itu menyediakan kesesuaian kebelakang untuk kode pra-1.0, tetapi fungsionalitasnya berulang. Gunakan Field.error_messages['invalid'] sebagai gantinya.
Sintaksis unordered_list lama¶
Sebuah terlama (pra-1.0), lebih bentuk masukan terbatas dan bertele-tele untuk saringan cetakan unordered_list telah diusangkan:
['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]
Menggunakan sintaksis baru, ini menjadi:
['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]
django.forms.Field._has_changed()¶
Namai kembali metode ini ke has_changed() dengan memindahkan garis bawah di depan. Nama lama akan masih bekerja sampai Django 1.10.
Penyaring cetakan django.utils.html.remove_tags() dan removetags¶
django.utils.html.remove_tags() sama halnya dengan saringan cetakan removetags telah diusangkan karena mereka tidak dapat menjamin keluaran aman.
Fungsi django.utils.html.strip_entities() tidak digunakan dan tidak terdokumentasikan juga telah diusangkan.
is_admin_site argumen ke django.contrib.auth.views.password_reset()¶
Itu adalah pilihan warisan yang harus tidak lagi dibutuhkan.
SubfieldBase¶
django.db.models.fields.subclassing.SubfieldBase telah diusangkan dan akan dipindahkan di Django 1.10. Secara riwayat, itu telah digunakan untuk menangani bidang-bidang dimana perubahan jenis dibutuhkan ketika memuat dari basisdata, tetapi itu tidak digunakan di pemanggilan .values() atau di pengumpulan. Itu telah diganti dengan from_db_value().
Pendekatan baru tidak memanggil metode to_python() pada penugasan seperti dulu kasus dengan SubfieldBase. Jika anda butuh perilaku itu, terapkan kembali kelas Creator from Django's source code di proyek anda.
django.utils.checksums¶
Modul django.utils.checksums telah diusangkan dan akan dipindahkan di Django 1.10. Fungsionalitas dia sediakan (memeriksa checksum menggunakan algoritma Luhn) tidak didokumentasikan dan tidak digunakan di Django. Modul telah dipindahkan ke paket django-localflavor (versi 1.1+).
InlineAdminForm.original_content_type_id¶
Atribut original_content_type_id pada InlineAdminForm telah diusangkan dan akan dipindahkan di Django 1.10. Secara riwayat, dia digunakan untuk membangun URL InlineAdminForm. URL ini sekarang dapat diakses menggunakan atribut absolute_url pada formulir.
Argumen form_class django.views.generic.edit.FormMixin.get_form()¶
Subkelas FormMixin yang menimpa metode get_form() harus memastikan menyediakan nilai awal untuk argumen form_class sejak itu sekarang menjadi pilihan.
Membangun cetakan dimuat oleh get_template() dengan Context¶
Jenis kembalian dari get_template() telah berubah di Django 1.8: sebagai gantinya django.template.Template, itu mengembalikan instance Template yang jenis tepatnya bergantung pada backend mana itu dimuat.
Kedua kelas menyediakan metode render(), bagaimanapun, yang awal mengambil django.template.Context sebagai sebuah argumen selagi yang terakhir mengharapkan dict. Perubahan ini dipaksakan melalui jalur pengusangan untuk cetakan Django.
Sejak itu lebih mudah memahami dengan contoh, upgrade guide menunjukkan bagaimana beradaptasi kode yang terpengaruh.
Semua ini juga berlaku ke select_template().
Kelas-kelas Template dan Context di cetakan tanggapan¶
Beberapa metode dari SimpleTemplateResponse dan TemplateResponse diterima obyek django.template.Context dan django.template.Template sebagai argumen. Mereka seharusnya menerima dict dan tergantung-backend obyek cetakan masing-masing.
Ini juga berlaku pada jenis kembalian jika anda mempunyai subkelas antara cetakan kelas tanggapan.
Periksa template response API documentation untuk rincian.
Argumen dictionary dan context_instance dari fungsi membangun¶
Fungsi berikut tidak lagi menerima parameter dictionary dan context_instance di Django 1.10:
django.shortcuts.render()django.shortcuts.render_to_response()django.template.loader.render_to_string()
Gunakan parameter context sebagai gantinya. Ketika dictionary dilewatkan sebagai argumen penempatan, yaitu dialek paling umum, tidak ada perubahan dibutuhkan.
Jika anda sedang melewatkan Context di context_instance, lewatkan dict di parameter context sebagai gantinya. Jika anda sedang melewatkan RequestContext, lewatkan permintaan secara terpisah di parameter request.
Argumen dirs dari fungsi cetakan-pencarian¶
Fungsi berikut tidak lagi menerima parameter dirs untuk menimpa TEMPLATE_DIRS di Django 1.10:
django.template.loader.get_template()django.template.loader.select_template()django.shortcuts.render()django.shortcuts.render_to_response()
Parameter tidak bekerja secara tetap terhadap pemuat cetakan berbeda dan tidak bekerja untuk cetakan disertakan.
django.template.loader.BaseLoader¶
django.template.loader.BaseLoader dinamai kembali menjadi django.template.loader.BaseLoader. Jika anda sedang menulis pemuat cetakan penyesuaian yang mewarisi BaseLoader, anda harus mewarisi Loader sebagai gantinya.
django.test.utils.TestTemplateLoader¶
API pribadi django.test.utils.TestTemplateLoader diusangkan mendukung django.template.loaders.locmem.Loader dan akan dipindahkan di Django 1.9.
Mendukung untuk argumen max_length pada kelas-kelas Storage peyesuaian¶
Subkelas Storage harus menambahkan max_length=None sebagai sebuah parameter pada get_available_name() dan/atau save() jika mereka menimpa baik metode. Dukungan untuk penyimpaan yang tidak menerima argumen ini akan dipindahkan di Django 1.10.
qn diganti oleh compiler¶
Di versi Django sebelumnya, beragam internal cara ORM (kebanyakan cara as_sql) menerima sebuah argumen qn (untuk "mengutip nama"), yang telah diacukan ke fungsi yang mengutip penciri untuk mengirimkan ke basisdata. Di Django 1.8, argumen tersebut telah dinamai kembali ke compiler dan sekarang instance SQLCompiler penuh. Untuk kesesuaian kebelakang, memanggil instance SQLCompiler melakukan pengutipan-nama sama yang fungsi qn biasanya. Bagaimanapun, shim kesesuaian kebelakang ini segera diusangkan: anda harus menamai kembali argumen qn anda ke compiler, dan panggil compiler.quote_name_unless_alias(...) dimana anda sebelumnya memanggil qn(...).
Nilai awal dari RedirectView.permanent¶
Nilai awal dari atribut RedirectView.permanent akan berubah dari True menjadi False di Django 1.9.
Menggunakan AuthenticationMiddleware tanpa SessionAuthenticationMiddleware¶
django.contrib.auth.middleware.SessionAuthenticationMiddleware telah ditambahkan di Django 1.7. Di 1.7.2, fungsionalitasnya telah dipindahkan ke auth.get_user() dan, untuk kesesuaian kebelakang, ada hanya jika 'django.contrib.auth.middleware.SessionAuthenticationMiddleware' muncul di MIDDLEWARE_CLASSES.
Di Django 1.10, pengecekan sesi akan diadakan meskipun apakah atau tidak SessionAuthenticationMiddleware diadakan (di mana titik SessionAuthenticationMiddleware akan tidak mempunyai makna). Anda dapat menambahkannya ke MIDDLEWARE_CLASSES anda terkadang sebelum kemudian dimasukkan. Silahkan baca upgrade considerations dahulu.
django.contrib.sitemaps.FlatPageSitemap¶
django.contrib.sitemaps.FlatPageSitemap telah dipindahkan ke django.contrib.flatpages.sitemaps.FlatPageSitemap. Tempat impor lama diusangkan dan akan dipindahkan di Django 1.9.
etiket cetakan ssi¶
Etiket cetakan ssi mengizinkan berkas untuk disertakan dalam sebuah cetakan oleh jalur mutlak. Ini adalah dari keterbatasan penggunaan paling di keadaan penyebaran, dan etiket include sering lebih masuk akal. Etiket ini sekarang diusangkan dan akan dipindahkan di Django 1.10.
= sebagai perbandingan penghubung di etiket cetakan if¶
Menggunakan tanda persamaan tunggal dengan etiket cetakan {% if %} untuk persamaan percobaan tidak didokumentasikan dan tidak dicoba. Itu sekarang diusangkan mendukung ==.
%(<foo>)s sintaksis di ModelFormMixin.success_url¶
Warisan sintaksis %(<foo>)s di ModelFormMixin.success_url diusangkan dan akan dipindahkan di Django 1.10.
Metode pengumpulan GeoQuerySet¶
Metode pengumpulan collect(), extent(), extent3d(), make_line(), dan unionagg() diusangkan dan harus diganti dengan berdasarkan-fungsi mereka pengumpulan yang sama (Collect, Extent, Extent3D, MakeLine, dan Union).
Tanda tangan dari metode perute allow_migrate¶
Tanda tangan dari metode allow_migrate() dari perute basisdata telah berubah dari allow_migrate(db, model) menjadi allow_migrate(db, app_label, model_name=None, **hints).
Ketika model_name disetel, nilai yang telah sebelumnya diberikan melalui penempatan argumen model mungkin tidak ditemukan didalam kamus hints dibawah kunci 'model'.
Setelah berganti ke tanda tangan baru perute akan juga dipanggil oleh tindakan RunPython dan RunSQL.
Fitur-fitur dipindahkan di 1.8¶
Fitur-fitur ini telah mencapai akhir siklus pengusangan mereka dan dipindahkan di Django 1.8. Lihat Fitur diusangkan di 1.6 untuk rincian, termasuk bagaimana memindahkan penggunaan fitur ini.
django.contrib.commentsdipindahkan.- API pengelolaan transaksi berikut dipindahkan:
TransactionMiddleware- penghias dan pengelola konteks
autocommit,commit_on_success, dancommit_manually, ditentukan didjango.db.transaction - Fungsi
commit_unless_manageddanrollback_unless_managed, juga ditentukan didjango.db.transaction - Pengaturan
TRANSACTIONS_MANAGED
- Etiket cetakan
cycledanfirstofmeloloskan otomatis argumen mereka. - Pengaturan
SEND_BROKEN_LINK_EMAILSdipindahkan. django.middleware.doc.XViewMiddlewaredipindahkan.- Nama lain
Model._meta.module_namedipindahkan. - Shim kesesuaian kebelakang diperkenalkan untuk menamai kembali
get_query_setdan metode queryset yang mirip dipindahkan. Ini mempengaruhi kelas-kelas berikut:BaseModelAdmin,ChangeList,BaseCommentNode,GenericForeignKey,Manager,SingleRelatedObjectDescriptordanReverseSingleRelatedObjectDescriptor. - Shim kesesuaian kebelakang diperkenalkan untuk menamai kembali atribut
ChangeList.root_query_setdanChangeList.query_setdipindahkan. django.views.defaults.shortcutdandjango.conf.urls.shortcutdipindahkan.- Dukungan untuk modul Python Imaging Library (PIL) dipindahkan.
- API pribadi berikut dipindahkan:
django.db.backenddjango.db.close_connection()django.db.backends.creation.BaseDatabaseCreation.set_autocommit()django.db.transaction.is_managed()django.db.transaction.managed()
django.forms.widgets.RadioInputtelah dipindah.- Modul
django.test.simpledan kelasdjango.test.simple.DjangoTestSuiteRunnerdipindahkan. - The module
django.test._doctestis removed. - Pengaturan
CACHE_MIDDLEWARE_ANONYMOUS_ONLYdipindahkan. Perubahan ini mempengaruhi keduadjango.middleware.cache.CacheMiddlewaredandjango.middleware.cache.UpdateCacheMiddlewaremeskipun kekurangan dari peringatan pengusangan di kelas terakhir. - Penggunaan dari kode-keras Tahan "Control", atau "Command" pada Mac, untuk memilih lebih dari satu. deretan karakter untuk dikesampingkan atau ditambahkan untuk
help_textdisediakan-pengguna dalam bentuk untuk bidang modelManyToManytidak dilakukan oleh Django lagi baik pada lapisan model atau formulir. - Metode
Model._meta.get_(add|change|delete)_permissiondipindahkan. - Kunci sesi
django_languagetidak lagi membaca untuk kesesuaian kebelakang. - Peta situs geografis dipindahkan (
django.contrib.gis.sitemaps.views.indexdandjango.contrib.gis.sitemaps.views.sitemap). django.utils.html.fix_ampersands, saringan cetakanfix_ampersands, dandjango.utils.html.clean_htmldipindahkan.