Catatan terbitan Django 1.11¶
4 April 2017
Selamat datang di Django 1.11!
Catatan terbitan ini mencangkup new features, sama halnya beberapa backwards incompatible changes anda akan ingin waspadai ketika meningkatkan dari Django 1.10 atau versi terlama. Kami telah begun the deprecation process for some features.
Lihat panduan Meningkatkan Django ke versi terbaru jika anda sedang memperbaharui proyek yang ada.
Django 1.11 dirancang sebagai long-term support release. Itu akan menerima pembaharuan keamanan untuk setidaknya tiga tahun setelah terbitannya. Dukungan untuk LTS sebelumnya, Django 1.8, akan berakhir di April 2018.
Kesesuaian Python¶
Django 1.11 membutuhkan Python 2.7, 3.4, 3.5, atau 3.6. Django 1.11 adalah terbitan pertama untuk mendukung Python 3.6. Kami sangat menganjurkan dan hanya secara resmi mendukung terbitan terakhir dari setiap rangkaian.
Rangkaian Django 1.11.x adalah terakhir untuk mendukung Python 2. Terbitan utama selanjutnya, Django 2.0, hanya akan mendukung Python 3.4+.
Peringatan pengusangan tidak lagi kencang secara awalan¶
Tidak seperti versi terlama dari Django, peringatan-peringatan pengusangan sendiri Django tidak lagi ditampilkan secara awalan. Ini tetap dengan perilaku awalan Python.
Perubahan ini mengizinkan aplikasi pihak-ketiga untuk mendukung kedua Django 1.11 LTS dan Django 1.8 LTS tanpa harus menghindari peringatan-peringatan pengusangan.
Berikut terbitan dari Django 2.0, kami menyarankan bahwa penulis apikasi pihak-ketiga menjatuhkan dukungan untuk semua versi Django sebelum 1.11. Pada waktu itu, anda harus dapat menjalankan percobaan paket menggunakan python -Wd sehingga peringatan pengusangan muncul. Setelah membuat perbaikan peringatan pengusangan, aplikasi anda harus cocok dengan Django 2.0.
Apa yang baru di Django 1.11¶
Indeks model berdasarkan-kelas¶
Modul django.db.models.indexes baru mengandung kelas-kelas yang memudahkan membuat indeks basisdata. Indeks-indeks ditambahkan ke model-model menggunakan pilihan Meta.indexes.
Kelas Index membuat sebuah indeks b-tree, seolah-olah anda menggunakan db_index pada bidang model atau index_together pada model kelas Meta. Itu dapat disubkelaskan untuk mendukung jenis-jenis indeks berbeda, seperti GinIndex. Itu juga mengizinkan menentukan urutan (ASC/DEC) untuk kolom-kolom dari indeks.
Membangun widget berdasarkan-cetakan¶
Untuk memudahkan menyesuaian widget, membangun widget formulir sekarang selesai menggunakan sistem cetakan daripada dalam Python. Lihat Formulir membangun API.
Anda mungkin butuh menyesuaikan widget penyesuaian apapun yang anda telah tulis untuk sedikit backwards incompatible changes.
Ungkapan Subquery¶
Pernyataan basisdata Subquery and Exists baru mengizinkan membuat sub permintaan jelas. Sub permintaan mungkin mengacu ke bidang-bidang dari queryset terluar menggunakan kelas OuterRef.
Fitur kecil¶
django.contrib.admin¶
ModelAdmin.date_hierarchysekarang dapat mengacu bidang-bidang terhadap hubungan.- Kaitan
ModelAdmin.get_exclude()baru mengizinkan menentukan bidang-bidang dikecualikan berdasarkan pada permintaan atau instance model. - Cetakan
popup_response.htmlsekarang dapat ditimpa per aplikasi, per model, atau dengan mengatur atributModelAdmin.popup_response_template.
django.contrib.auth¶
- Hitungan perulangan awalan untuk pencampur sandi PBKDF2 meningkat sebesar 20%.
- Tampilan berdasarkan-kelas
LoginViewandLogoutViewmenggantikan tampilan berdasarkan-fungsilogin()danlogout()yang diusangkan. - Tampilan berdasarkan-kelas The
PasswordChangeView,PasswordChangeDoneView,PasswordResetView,PasswordResetDoneView,PasswordResetConfirmView, danPasswordResetCompleteViewmenggantikan tampilan berdasarkan-fungsipassword_change(),password_change_done(),password_reset(),password_reset_done(),password_reset_confirm(), danpassword_reset_complete()yang diusangkan. - Atribut
post_reset_loginbaru untukPasswordResetConfirmViewmengizinkan secara otomatis masuk seorang pengguna setelah berhasil menyetel kembali sandi. Jika anda mempunyai banyakAUTHENTICATION_BACKENDSdikonfigurasi, gunakan atributpost_reset_login_backenduntuk memilih yang mana satu digunakan. - Untuk menghindari kemungkinan kebocoran token menyetel kembali sandi melalui kepala HTTP Referer (sebagai contoh, jika halaman menyetel kembali menyertakan sebuah acuan pada CSS atau JavaScript disimpan pada ranah lain),
PasswordResetConfirmView(tetapi bukan tampilan berdasarkan-fungsipassword_reset_confirm()yang diusangkan) menyimpan token dalam sebuah sesi dan mengalihkan ke itu sendiri untuk menghadirkan formulir rubah sandi ke pengguna tanpa token dalam URL. update_session_auth_hash()sekarang memutar kunci sesi untuk mengizinkan perubahan sandi untuk kue sesi dicuri tidak sah.- Atribut
success_url_allowed_hostsbaru untukLoginViewdanLogoutViewmengizinkan menentukan sekumpulan dari rumah yang aman untuk pengalihan setelah masuk dan keluar. - Ditambahkan pengesah sandi
help_textpadaUserCreationForm. HttpRequestsekarang dilewatkan keauthenticate()yang gilirannya melewatkan itu ke backend autentifikasi jika itu menerima sebuah argumenrequest.- Sinyal
user_login_failed()sekarang menerima sebuah argumenrequest. PasswordResetFormmendukung penyesuaian pengguna model-model yang menggunakan sebuah bidang surel bernama sesuatu selain'email'. SetelCustomUser.EMAIL_FIELDke nama dari bidang.get_user_model()sekarang dapat dipanggil pada waktu impor, bahkan dalam modeul-modul yang menentukan model-model.
django.contrib.contenttypes¶
- Ketika jenis isi basi dikenali dalam perintah
remove_stale_contenttypes, ada sekarang daftar dari obyek terkait sepertiauth.Permissionyang akan juga dihapus. Sebelumnya, hanya jenis isi yang ditampilkan (dan penunjukan ini setelahmigratedaripada dalam perintah terpisah).
django.contrib.gis¶
- Metode
GEOSGeometry.from_gml()danOGRGeometry.from_gml()baru mengizinkan membuat geometri dari GML. - Ditambahkan dukungan untuk pencarian
dwithinpada SpatiaLite. - Fungsi
Area,Distancefunction, dan pencarian tujuan sekarang bekerja dengan kordinat geodetik pada SpatiaLite. - Widget bentuk berdasarkan-OpenLayer sekarang menggunakan
OpenLayers.jsdarihttps://cdnjs.cloudflare.comyang lebih cocok untuk penggunaan produksi daripada sumberhttp://openlayers.orglama. Mereka juga diperbaharui untuk menggunakan OpenLayers 3. - Perpindahan PostGIS sekarang dapat merubah bidang dimensi.
- Ditambahkan kemampuan melewatkan parameter size, shape, dan offset ketika memuat obyek
GDALRaster. - Ditambahkan dukungan SpatiaLite untuk fungsi
IsValid, fungsiMakeValid, dan pencarianisvalid. - Ditambahkan dukungan Oracle untuk fungsi
AsGML, fungsiBoundingCircle, fungsiIsValidfunction, dan pencarianisvalid.
django.contrib.postgres¶
- Argumen
distinctbaru untukStringAggditentukan jika nilai-nilai gabungan akan dibedakan. - Kelas-kelas
GinIndexdanBrinIndexbaru mengizinkan membuat indeks-indeksGINdanBRINdalam basisdata. JSONFieldmenerima sebuah parameterencoderbaru untuk menentukan kelas penyesuaian untuk menyandikan jenis-jenis data tidak didukung oleh penyandi standar.- Mixin
CITextbaru dan tindakan perpindahanCITextExtensionmengizinkan menggunakan tambahancitextPostgreSQL untuk pencarian kasus-tidak-sensitif. Tiga bidang disediakan:CICharField,CIEmailField, danCITextField. JSONBAggbaru mengizinkan menggabungkan nilai-nilai sebagai larik JSON.HStoreField(bidang model) danHStoreField(bidang formulir) mengizinkan menyimpan nilai null.
Tembolok¶
- Backend memcached sekarang melewatkan isi dari
OPTIONS 1sebagai argumen katakunci ke pembangun klien, mengizinkan untuk pengendalian lebih lanjut dari perulaku klien. Lihat dokumentasi cache arguments 2 sebagai contoh. - Backend memcached sekarang mengizinkan banyak peladen sebagai string comma-delimited dalam
LOCATION 1, untuk kenyamanan dengan layanan pihak-ketiga yang menggunakan string tersebut dalam variabel lingkungan.
CSRF¶
- Ditambahkan pengaturan
CSRF_USE_SESSIONSuntuk mengizinkan menyimpan token CSRF dalam sesi pengguna daripada dalam sebuah kue.
Backend basisdata¶
- Ditambahkan argumen
skip_lockedpadaQuerySet.select_for_update()pada PostgreSQL 9.5+ dan Oracle untuk menjalankan permintaan denganFOR UPDATE SKIP LOCKED. - Ditambahkan pengaturan
TEST['TEMPLATE']untuk membuat pengguna PostgreSQL menentukan sebuah cetakan untuk membuat basisdata percobaan. QuerySet.iterator()sekarang menggunakan server-side cursors pada PostgreSQL. Fitur ini mengirimkan beberapa dari pekerja memori muatan (digunakan untuk menampung hasil permintaan) ke basisdata dan mungkin meningkatkan penggunaan memori basisdata.- Ditambahkan dukungan MySQL untuk pilihan
'isolation_level'dalamOPTIONSuntuk mengizinkan menentukan transaction isolation level. Untuk menghindari kemungkinan data hilang, itu dianjurkan untuk mengganti dari tingkat awalan MySQL, pembacaan berulang, untuk membaca diperbaiki. - Ditambahkan dukungan untuk
cx_Oracle5.3.
Surel¶
- Ditambahkan pengaturan
EMAIL_USE_LOCALTIMEuntuk mengizinkan mengirimkan kepala tanggal SMTP dalam zona waktu lokal daripada dalam UTC. EmailMessage.attach()danattach_file()kembali ke jenis MIME application/octet-stream` ketika isi biner yang tidak dapat disandikan sebagai UTF-8 ditentukan untuk lampirantext/*.
Penyimpanan Berkas¶
- Untuk membuatnya dapat dibungkus oleh
io.TextIOWrapper,Filesekarang mempunyai metodereadable(),writable(), danseekable().
Formulir¶
- Atribut
CharField.empty_valuebaru mengizinkan menentukan nilai Python untuk digunakan untuk mewakili "empty". - Metode
Form.get_initial_for_field()baru mengembalikan data inisial untuk sebuah bidang formulir.
Internasionalisasi¶
- Pembentukan angka dan pengaturan
NUMBER_GROUPINGdukungan pengelompokan angka bukan-seragam.
Pengelolaan perintah¶
- Pilihan
loaddata --excludebaru mengizinkan tidak menyertakan model dan aplikasi selagi memuat data dari peralatan tetap. - Pilihan
diffsettings --defaultbaru mengizinkan menentukan modul pengaturan selain dari pengaturan awalan Django untuk dibandingkan. - Argumen
app_labelsekarang membatasi keluaranshowmigrations --plan.
Perpindahan¶
- Ditambahkan dukungan untuk serialisasi dari obyek
uuid.UUID.
Model¶
- Ditambahkan dukungan untuk nilai dapat dipanggil dalam argumen
defaultsdariQuerySet.update_or_create()danget_or_create(). ImageFieldsekarang mempunyai pengesah awalanvalidate_image_file_extension. (Pengesah ini pindah dari bidang formulir dalam Django 1.11.2.)- Ditambahkan dukungan untuk waktu pemotongan pada fungsi
Trunc. - Ditambahkan fungsi
ExtractWeekuntuk mengeluarkan minggu dariDateFielddanDateTimeFielddan menampilkan itu melalui pencarianweek. - Ditambahkan fungsi
TruncTimeuntuk memotongDateTimeFieldke komponen waktunya dan menampilan itu melalui pencariantime. - Ditambahkan dukungan untuk pernyataan dalam
QuerySet.values()danvalues_list(). - Ditambahkan dukungan untuk pernyataan permintaan yang mengambil banyak argumen, seperti
range. - Anda dapat sekarang menggunakan pilihan
unique=TruedenganFileField. - Ditambahkan parameter
nulls_firstdannulls_lastkeExpression.asc()dandesc()untuk mengendalikan urutan dari nilai-nilai null. - Pernyataan
Fbaru metodebitleftshift()danbitrightshift()mengizinkan bitwise shift operations. - Ditambahkan
QuerySet.union(),intersection(), dandifference().
Permintaan dan Tanggapan¶
- Ditambahkan
QueryDict.fromkeys(). CommonMiddlewaresekarang menyetel kepala tanggapanContent-Lengthuntuk tanggapan bukan-aliran.- Ditambahkan pengaturan
SECURE_HSTS_PRELOADuntuk mengizinkan menambahkan petunjukpreloadke kepalaStrict-Transport-Security. ConditionalGetMiddlewaresekarang menambahkan kepalaETagpada tanggapan.
Serialisasi¶
- Atribut
django.core.serializers.base.Serializer.stream_classbaru mengizinkan subkelas untuk menyesuaiakan aliran awalan. - Penyandi digunakan oleh JSON serializer 1 dapat disesuaikan dengan melewatkan argumen katakunci
clspada fungsiserializers.serialize(). DjangoJSONEncodersekarang menserialkan obyektimedelta(digunakan olehDurationField).
Templat¶
mark_safe()sekarang dapat digunakan sebagai penghias.- Backend cetakan
Jinja2sekarang mendukung pengolah konteks dengan mengatur pilihan'context_processors'dalamOPTIONS 1. - Etiket
regroupsekarang mengembalikannamedtupledaripada dictionay sehingga anda dapat mengeluarkan kelompok obyek langsung dalam putaran, sebagai contoh{% for grouper, list in regrouped %}. - Ditambahkan etiket cetakan
resetcycleuntuk mengizinkan mengatur kembali urutan dari etiket cetakancycle. - Anda sekarang dapat menentukan direktori khusus untuk
filesystem.Loadertertentu.
Pengujian¶
- Ditambahkan
DiscoverRunner.get_test_runner_kwargs()untuk mengizinkan penyesuaian argumen katakunci dilewatkan ke penjalan percobaan. - Ditambahkan pilihan
test --debug-modeuntuk membantu memecahkan masalah kegagalan percobaan dengan mengatur pengaturanDEBUGmenjadiTrue. django.test.utils.setup_databases()baru (dipindah daridjango.test.runner) dan fungsiteardown_databases()membuatnya lebih mudah membangun pejalan percobaan penyesuaian.- Ditambahkan dukungan untuk
unittest.TestCase.subTest()ketika menggunakan pilihantest --parallel. DiscoverRunnersekarang menjalankan pemeriksaan sistem pada awal dari penjalanan percobaan. Timpa metodeDiscoverRunner.run_checks()jika anda ingin meniadakan itu.
Pengesah¶
- Ditambahkan
FileExtensionValidatoruntuk mensahkan berkas tambahan danvalidate_image_file_extensionuntuk mensahkan berkas-berkas gambar.
Perubahan ketidaksesuaian kebelakang dalam 1.11¶
django.contrib.gis¶
- Untuk memudahkan basiskode dan karena itu lebih mudah memasang daripada ketika
contrib.gisterbitan pertama, GDAL sekarang membutuhkan ketergantungan untuk GeoDjango. Dalam versi terlama, itu hanya dibutuhkan untuk SQLite. contrib.gis.mapsdipindahkan ketika itu mengantarmukakan dengan versi pensiun dari Google Maps API dan kelihatan untuk tidak dirawat. Jika anda sedang menggunakan itu, let us know.- Penghubung persamaan
GEOSGeometrysekarang juga membandingkan SRID. - Widget formulir berdasarkan-OpenLayer sekarang menggunakan OpenLayer 3, dan cetakan
gis/openlayers.htmldangis/openlayers-osm.htmltelah diperbaharui. Periksa proyek anda jika anda mensubkelaskan widget-widget ini atau memperpanjang cetakan. Juga, widget baru bekerja sedikit berbeda daripada satu yang lama. Daripada menggunakan sebuah alat batang dalam widget, anda klik untuk menggambar, klik dan seret untuk memindahkan peta, dan klik dan seret titik, vertex/sudut untuk memindahkan itu. - Dukungan untuk SpatiaLite < 4.0 telah dibuang.
- Dukungan untuk GDAL 1.7 dan 1.8 telah dibuang.
- Widget dalam
contrib.gis.forms.widgetsdanOpenLayersWidgetadmin menggunakan form rendering API 1 daripada daripadaloader.render_to_string(). Jika anda sedang menggunakan cetakan widget penyesuaian, anda akan butuh memastikan formulir anda dibangun dapat menempatkan itu. Sebagai contoh, anda dapat juga menggunakan pembangunTemplatesSetting.
django.contrib.staticfiles¶
collectstaticmungkin sekarang gagal selama penempatan-pengolahan ketika menggunakan sebuah penyimpanan berkas statis dicampur jika perulangan terkait ada (sebagai contoh'foo.css'mengacu'bar.css'yang itu sendiri mengacu'foo.css') atau jika rantai dari berkas-berkas mengacu berkas-berkas lain terlalu dalam untuk dipecahkan dalam beberapa perlewatan. Dalam kasus terakhir, meningkatkan sejumlah perlewatan menggunakanManifestStaticFilesStorage.max_post_process_passes.- Ketika menggunakan
ManifestStaticFilesStorage, berkas-berkas statis tidak ditemukan dalam manifest pada waktu berjalan sekarang memunculkanValueErrordaripada mengembalikan jalur tidak berubah. Anda dapat merubah ke perilaku lama dengan mengaturManifestStaticFilesStorage.manifest_strictmenjadiFalse.
API backend basisdata¶
- Metode
DatabaseOperations.time_trunc_sql()ditambahkan untuk mendukung pemotonganTimeField. Itu menerima argumenlookup_typedanfield_namedan mengembalikan SQL sesuai untuk memotong bidang waktu yang diberikan pada sebuah obyek waktu dengan hanya diberikan kekhususan. Argumenlookup_typedapat salsah satu'hour','minute', atau'second'. - Metode
DatabaseOperations.datetime_cast_time_sql()ditambahkan untuk mendukung pencariantime. Itu menerima argumenfield_namedantznamedan mengembalikan SQL yang dibutuhkan untuk membuang nilai datetime menjadi nilai waktu. - Untuk mengadakan dukungan
FOR UPDATE SKIP LOCKED, setelDatabaseFeatures.has_select_for_update_skip_locked = True. - Atribut
DatabaseFeatures.supports_index_column_orderingbaru menentukan jika sebuah basisdata mengizinkan menentukan urutan untuk kolom-kolom dalam indeks. Nilai awalan adalahTruedan metodeDatabaseIntrospection.get_constraints()harus menyertakan kunci'orders'dalam setiap dari kamus-kamus yang dikembalikan dengan daftar dari nilai-nilai'ASC'dan/atau'DESC'berhubungan ke urutan dari setiap kolom dalam indeks. inspectdbtidak lagi memanggilDatabaseIntrospection.get_indexes()yang diusangkan. Backend basisdata penyesuaian harus memastikan semua jenis dari indeks dikembalikan olehDatabaseIntrospection.get_constraints().- Namai kembali fitur
ignores_quoted_identifier_caseuntukignores_table_name_caseuntuk lebih akurat mencerminkan bagaimana itu digunakan. - Argumen kata kunci
nameditambahkan ke metodeDatabaseWrapper.create_cursor(self, name=None)untuk mengizinkan penggunaan dari kursor sisi-peladen pada backend yang mendukung itu.
Dibuang dukungan untuk PostgreSQL 9.2 dan PostGIS 2.0¶
Dukungan hulu untuk PostgreSQL 9.2 berakhir dalam September 2017. Sebagai konsekuensinya, Django 1.11 menyetel PostgreSQL 9.3 sebagai versi minimal itu secara resmi dukung.
Dukungan untuk PostGIS 2.0 juga dipindahkan sebagai PostgreSQL 9.2 adalah versi terakhir untuk mendukung itu.
Juga, versi didukung minimal dari psycopg2 ditingkatkan dari 2.4.5 menjadi 2.5.4.
LiveServerTestCase mengikat ke port nol¶
Daripada mengambil jangkauan port dan mengulang menemukan port bebas, LiveServerTestCase mengikat port ke nol dan bergantung pada sistem operasi untuk memberikan port bebas. Variabel lingkungan DJANGO_LIVE_TEST_SERVER_ADDRESS tidak lagi digunakan, dan ketika itu tidak lagi digunakan, pilihan manage.py test --liveserver dipindahkan.
Jika anda butuh mengikat LiveServerTestCase pada port khusus, gunakan atribut port ditambahkan dalam Django 1.11.2.
Perlindungan terhadap pengalihan tidak aman dalam tampilan django.contrib.auth dan i18n¶
LoginView, LogoutView (dan setara berdasarkan-fungsi diusangkan), dan set_language() melindungi pengguna dari sedang dialigkan ke bukan-HTTPS url next ketika aplikasi sedang berjalan terhadap HTTPS.
Argumen pengecekan QuerySet.get_or_create() dan update_or_create()¶
Untuk mencegah salah ketik dari melewatkan secara diam, get_or_create() dan update_or_create() memeriksa bahwa argumen mereka adalah bidang model. Ini harus berupa ketidaksesuaian-kebelakang hanya dalam fakta bahwa itu mungkin mengungkapkan kesalahan dalam proyek anda.
pytz adalah ketergantungan diwajibkan dan mendukung untuk settings.TIME_ZONE = None dipindahkan¶
Untuk menyerdahanakan penanganan zona waktu Django, pytz sekarang membutuhkan ketergantungan. Itu otomatis memasang bersama dengan Django.
Dukungan untuk settings.TIME_ZONE = None dipindahkan ketika perilaku tidak umum digunakan dan berguna tanya. Jika anda ingin otomatis mengetahui zona waktu berdasarkan pada sistem zona waktu, anda dapat menggunakan tzlocal:
from tzlocal import get_localzone
TIME_ZONE = get_localzone().zone
Pekerjaan ini mirip pada settings.TIME_ZONE = None kecuali bahwa itu juga menyetel os.environ['TZ']. Let us know jika ada kasus penggunaan dimana anda menemukan anda tidak bisa menyesuaikan kode anda untuk disetel TIME_ZONE.
Perubahan HTML dalam cetakan admin¶
<p class="help"> diganti dengan etiket <div> untuk mengizinkan daftar di dalam teks bantuan.
Bidang-bidang hanya-baca dibungkus dalam 1...1 daripada 2...2 untuk mengizinkan apapun dari HTML sebagai isi bidang.
Perubahan karena perkenalan dari membangun widget berdasarkan-cetakan¶
Beberapa kelas-kelas tidak terdokumentasi dalam django.forms.widgets dipindahkan:
SubWidgetRendererMixin,ChoiceFieldRenderer,RadioFieldRenderer,CheckboxFieldRendererChoiceInput,RadioChoiceInput,CheckboxChoiceInput
Metode Select.render_option() tidak didokumentasikan dipindahkan.
Metode Widget.format_output() dipindahkan. Gunakan cetakan widget penyesuaian sebagai gantinya.
Beberapa nilai widget, seperti pilihan 1, sekarang dipelokalan jika settings.USE_L10N=True. Anda dapat merubah ke perilaku lama dengan cetakan widget penyesuaian yang menggunakan etiket cetakan localize untuk mematikan pelokalan.
django.template.backends.django.Template.render() melarang konteks bukan-dict¶
Untuk kesesuaian dengan banyak cetakan mesin, django.template.backends.django.Template.render() (dikembalikan dari API pemuat cetakan tingkat-tinggi seperti loader.get_template()) harus menerima sebuah dictionary dari konteks daripada Context atau RequestContext. Jika anda sedang melewatkan antara dua kelas, lewatkan dictionary sebagai gantinya -- melakukan itu kesesuaian-kebelakang dengan versi terlama dari Django.
Perubahan keadaan model dalam tindakan perpindahan¶
Untuk meningkatkan kecepatan dari memberlakukan perpindahan, membangun dari model terkait ditunda sampai sebuah tindakan yang butuh mereka (sebagai contoh RunPython). Jika anda mempunyai tindakan penyesuaian yang bekerja dengan kelas-kelas model atau instance mode dari argumen from_state dalam database_forwards() atau database_backwards(), anda harus membangun keadaan model menggunakan metode clear_delayed_apps_cache() seperti digambarkan dalam writing your own migration operation 1.
Bermacam-macam¶
Jika tidak ada barang dalam umpan mempunyai atribut
pubdateatauupdateddate,SyndicationFeed.latest_post_date()sekarang mengembalikan date/time UTC saat ini, daripada datetime tanpa informasi zona waktu apapun.Kegagalan CSRF dicatat ke pencatat
django.security.csrfdaripadadjango.request.Pengesahan
ALLOWED_HOSTStidak lagi ditiadakan ketika menjalankan percobaan. Jika aplikasi anda termasuk percobaan dengan nama rumah penyesuaian, anda harus menyertakan nama rumah tersebut dalamALLOWED_HOSTS. Lihat Tests and multiple host names.Menggunakan id foreign key (sebagai contoh
'field_id') dalamModelAdmin.list_displaymenampilan ID obyek terkait. Pindahkan akhiran_idjika anda ingin perilaku lama dari string mewakili dari obyek.Dalam formulir model,
CharFielddengannull=Truesekarang menyimpan nilaiNULLdaripada string kosong.Pada Oracle,
Model.validate_unique()tidak lagi memeriksa string kosong untuk keunikan sebagai penafsir basisdata nilai sebagaiNULL.Jika anda mensubkelaskan
AbstractUserdan menimpaclean(), pastikan itu memanggilsuper().BaseUserManager.normalize_email()dipanggil dalam sebuah metodeAbstractUser.clean()baru sehingga nomarlisasi diberlakukan dalam kasus-kasus seperti pengesahan formulir model.EmailFielddanURLFieldtidak lagi menerima argumen katakuncistrip. Pindahkan itu karena itu tidak mempunyai pengaruh dalam versi terlama dari Django ketika bidang ini selalu menghilangkan ruang putih.Atribut
checkedandselecteddibangun dengan widget formulir sekarang menggunakan sintaksis boolean HTML5 daripadachecked='checked'andselected='selected'XHTML.RelatedManager.add(),remove(),clear(), danset()sekarang membersihkan cacheprefetch_related().Untuk mencegah kemungkinan kehilangan dari pengaturan disimpan,
setup_test_environment()sekarang memunculkan sebuah pengecualian jika dipanggil satu detik sebelum memanggilteardown_test_environment().Nama lain
DateTimeAwareJSONEncodertidak terdokumentasi untukDjangoJSONEncoder(dinamai kembali dalam Django 1.0) dipindahkan.cached template loadersekarang diadakan jikaDEBUGadalahFalsedanOPTIONS['loaders'] 1tidak ditentukan. Ini dapat berupa ketidaksesuaian-kebelakang jika anda mempunyai beberapa template tags that aren't thread safe 2.Penunjukan untuk penghapusan jenis isi basi tidak lagi muncul setelah menjalankan perintah
migrate. Gunakan perintahremove_stale_contenttypesbaru sebagai gantinya.Widget admin untuk
IntegerFieldmenggunakantype="number"daripadatype="text".Kepala HTTP bersyarat sekarang diuraikan dan dibandingkan menurut rfc:7232 spesifikasi Permintaan Bersyarat daripada yang lama RFC 2616.
patch_response_headers()tidak lagi menambah kepalaLast-Modified. Menurut RFC 7234#section-4.2.2, kepala ini tidak berguna bersama kepala cache lain yang menyediakan sebuah waktu kadaluarsa yang jelas, sebagai contohExpiresatauCache-Control.UpdateCacheMiddlewaredanadd_never_cache_headers()callpatch_response_headers()dan maka dari itu juga dipengaruhi oleh perubahan ini.Dalam cetakan admin,
1diganti dengan etiket2untuk mengizinkan menyertakan daftar didalam teks bantuan.ConditionalGetMiddlewaretidak lagi menyetel kepalaDateketika peladen Jaringan menyetel kepala itu. Itu juga tidak lagi menyetel kepalaContent-Lengthketika ini diselesaikan olehCommonMiddleware.If you have a middleware that modifies a response's content and appears before
CommonMiddlewarein theMIDDLEWAREorMIDDLEWARE_CLASSESsettings, you must reorder your middleware so that responses aren't modified afterContent-Lengthis set, or have the response modifying middleware reset theContent-Lengthheader.get_model()danget_models()sekarang memunculkanAppRegistryNotReadyjika mereka dipanggil sebelum model dari semua aplikasi telah dimuat. Sebelumnya mereka hanya membutuhkan sasaran model aplikasi untuk dimuat dan demikian dapat mengembalikan model tanpa semua hubungan mereka disetel. Jika anda butuh perilaku lama dariget_model(), setel argumenrequire_readymenjadiFalse.Atribut
BaseCommand.can_import_settingstidak digunakan dipindahkan.Internal
django.utils.functional.lazy_propertydipindahkan.Untuk ketetapan dengan permintaan bukan-banyak-bagian,
MultiPartParser.parse()sekarang meninggalkanrequest.POSTkekal. Jika anda sedang merubahQueryDictitu, anda harus sekarang pertama menyalin, sebagai contohrequest.POST.copy().Dukungan untuk
cx_Oracle< 5.2 telah dipindahkan.Dukungan untuk IPython < 1.0 telah dipindahkan dari perintah
shell.Tanda tangan dari API pribadi
Widget.build_attrs()berubah dariextra_attrs=None, **kwargsmenjadibase_attrs, extra_attrs=None.Obyek seperti-berkas (sebagai contoh
StringIOdanBytesIO) diunggah pada sebuahImageFieldmenggunakan klien percobaan sekarang membutuhkan sebuah atributnamedengan sebuah nilai yang melewatkan pengesahvalidate_image_file_extension. Lihat catatan dalamClient.post().
Fitur-fitur diusangkan dalam 1.11¶
Penghias models.permalink()¶
Gunakan django.urls.reverse() sebagai gantinya. Sebagai contoh:
from django.db import models
class MyModel(models.Model):
...
@models.permalink
def url(self):
return ('guitarist_detail', [self.slug])
menjadi:
from django.db import models
from django.urls import reverse
class MyModel(models.Model):
...
def url(self):
return reverse('guitarist_detail', args=[self.slug])
Bermacam-macam¶
- Tampilan berdasarkan-fungsi
login()danlogout()contrib.authdiusangkan menduung dari tampilan berdasarkan-kelas baruLoginViewdanLogoutView. - Parameter
extra_contexttidak digunakan daricontrib.auth.views.logout_then_login()diusangkan. - Tampilan berdasarkan-fungsi
contrib.auth’spassword_change(),password_change_done(),password_reset(),password_reset_done(),password_reset_confirm(), danpassword_reset_complete()diusangkan mendukung dari tampilan berdasarkan-kelas baruPasswordChangeView,PasswordChangeDoneView,PasswordResetView,PasswordResetDoneView,PasswordResetConfirmView, danPasswordResetCompleteView. django.test.runner.setup_databases()dipindahkan kedjango.test.utils.setup_databases(). Tempat lama diusangkan.django.utils.translation.string_concat()diusangkan mendukungdjango.utils.text.format_lazy().string_concat(*strings)dapat diganti olehformat_lazy('{}' * len(strings), *strings).- Untuk backend cache
PyLibMCCache, lewatkan pengaturan perilakupylibmcsebagai atribut tingkat-atas dariOPTIONSdiusangkan. Setel mereka dibawah kuncibehaviorsdalamOPTIONSsebagai gantinya. - Parameter
hostdaridjango.utils.http.is_safe_url()diusangkan mendukung parameterallowed_hostsbaru. - Mendiamkan pengecualian yang muncul selagi membangun etiket cetakan
{% include %} 1diusangkan sebagai perilaku sering lebih membingungkan daripada membantu. Dalam Django 2.1, pengecualian akan dimunculkan. DatabaseIntrospection.get_indexes()diusangkan mendukungDatabaseIntrospection.get_constraints().authenticate()sekarang melewatkan sebuah argumenrequestpada metodeauthenticate()dari backend autentifikasi. Dukungan untuk metode-metode yang tidak menerimarequestsebagai argumen penempatan pertama akan dipindahkan dalam Django 2.1.- Pengaturan
USE_ETAGSdiusangkan mendukungConditionalGetMiddlewareyang sekarang menambah kepalaETagpada tanggapan tanpa memperdulikan pengaturan.CommonMiddlewaredandjango.utils.cache.patch_response_headers()tidak akan lagi menyetel ETags ketika pengusangan berakhir. Model._meta.has_auto_fielddiusangkan mendukung dari pemeriksaan jikaModel._meta.auto_field bukan None.- Menggunakan kelompok regular expression dengan
iLmsu#dalamurl()diusangkan. Hanya kelompok yang berguna adalah(?i)untuk URL kasus-tidak-sensitif, bagaimanapun, URL kasus-tidak-sensitif bukan praktik bagus karena mereka membuat banyak masukan untuk setiap mesin pencari, sebagai contoh. Sebuah pemecahan lain dapat membuathandler404yang mencari karakter huruf besar dalam URL dan pengalihkan ke setara huruf kecil. - Argumen
rendererditambahkan pada metodeWidget.render(). Metode-metode yang tidak menerima bahwa argumen akan bekerja melalui masa pengusangan.