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 mewajibkan Python 2.7, 3.4, 3.5, 3.6, atau 3.7 (pada 1.11.17). Kami sangat menganjurkan dan hanya resmi mendukung terbitan terakhir 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_hierarchy
sekarang 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.html
sekarang 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
LoginView
andLogoutView
menggantikan tampilan berdasarkan-fungsilogin()
danlogout()
yang diusangkan. - Tampilan berdasarkan-kelas The
PasswordChangeView
,PasswordChangeDoneView
,PasswordResetView
,PasswordResetDoneView
,PasswordResetConfirmView
, danPasswordResetCompleteView
menggantikan tampilan berdasarkan-fungsipassword_change()
,password_change_done()
,password_reset()
,password_reset_done()
,password_reset_confirm()
, danpassword_reset_complete()
yang diusangkan. - Atribut
post_reset_login
baru untukPasswordResetConfirmView
mengizinkan secara otomatis masuk seorang pengguna setelah berhasil menyetel kembali sandi. Jika anda mempunyai banyakAUTHENTICATION_BACKENDS
dikonfigurasi, gunakan atributpost_reset_login_backend
untuk 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_hosts
baru untukLoginView
danLogoutView
mengizinkan menentukan sekumpulan dari rumah yang aman untuk pengalihan setelah masuk dan keluar. - Ditambahkan pengesah sandi
help_text
padaUserCreationForm
. HttpRequest
sekarang dilewatkan keauthenticate()
yang gilirannya melewatkan itu ke backend autentifikasi jika itu menerima sebuah argumenrequest
.- Sinyal
user_login_failed()
sekarang menerima sebuah argumenrequest
. PasswordResetForm
mendukung penyesuaian pengguna model-model yang menggunakan sebuah bidang surel bernama sesuatu selain'email'
. SetelCustomUser.EMAIL_FIELD
ke 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.Permission
yang akan juga dihapus. Sebelumnya, hanya jenis isi yang ditampilkan (dan penunjukan ini setelahmigrate
daripada dalam perintah terpisah).
django.contrib.gis
¶
- Metode
GEOSGeometry.from_gml()
danOGRGeometry.from_gml()
baru mengizinkan membuat geometri dari GML. - Ditambahkan dukungan untuk pencarian
dwithin
pada SpatiaLite. - Fungsi
Area
,Distance
function, dan pencarian tujuan sekarang bekerja dengan kordinat geodetik pada SpatiaLite. - Widget formulir OpenLayers-based sekarang menggunakan
OpenLayers.js
darihttps://cdnjs.cloudflare.com
yaitu lebih cocok untuk penggunaan produksi dari pada sumber lamahttps://openlayers.org/
. Mereka juga memperbaharui untuk menggunakan 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
, fungsiIsValid
function, dan pencarianisvalid
.
django.contrib.postgres
¶
- Argumen
distinct
baru untukStringAgg
ditentukan jika nilai-nilai gabungan akan dibedakan. - Kelas-kelas
GinIndex
danBrinIndex
baru mengizinkan membuat indeks-indeksGIN
danBRIN
dalam basisdata. JSONField
menerima sebuah parameterencoder
baru untuk menentukan kelas penyesuaian untuk menyandikan jenis-jenis data tidak didukung oleh penyandi standar.- Mixin
CIText
baru dan tindakan perpindahanCITextExtension
mengizinkan menggunakan tambahancitext
PostgreSQL untuk pencarian kasus-tidak-sensitif. Tiga bidang disediakan:CICharField
,CIEmailField
, danCITextField
. JSONBAgg
baru 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 1
sebagai 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_SESSIONS
untuk mengizinkan menyimpan token CSRF dalam sesi pengguna daripada dalam sebuah kue.
Backend basisdata¶
- Ditambahkan argumen
skip_locked
padaQuerySet.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'
dalamOPTIONS
untuk 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_Oracle
5.3.
Surel¶
- Ditambahkan pengaturan
EMAIL_USE_LOCALTIME
untuk 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
,File
sekarang mempunyai metodereadable()
,writable()
, danseekable()
.
Formulir¶
- Atribut
CharField.empty_value
baru 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_GROUPING
dukungan pengelompokan angka bukan-seragam.
Pengelolaan perintah¶
- Pilihan
loaddata --exclude
baru mengizinkan tidak menyertakan model dan aplikasi selagi memuat data dari peralatan tetap. - Pilihan
diffsettings --default
baru mengizinkan menentukan modul pengaturan selain dari pengaturan awalan Django untuk dibandingkan. - Argumen
app_label
sekarang membatasi keluaranshowmigrations --plan
.
Perpindahan¶
- Ditambahkan dukungan untuk serialisasi dari obyek
uuid.UUID
.
Model¶
- Ditambahkan dukungan untuk nilai dapat dipanggil dalam argumen
defaults
dariQuerySet.update_or_create()
danget_or_create()
. ImageField
sekarang mempunyai pengesah awalanvalidate_image_file_extension
. (Pengesah ini pindah dari bidang formulir dalam Django 1.11.2.)- Ditambahkan dukungan untuk pemotongan waktu pada fungsi-fungsi
Trunc
. - Ditambahkan fungsi
ExtractWeek
untuk mengambil minggu dariDateField
danDateTimeField
dan dibuka melalui pencarianweek
. - Ditambahkan fungsi
TruncTime
untuk memotongDateTimeField
ke komponen waktunya dan dibuka 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=True
denganFileField
. - Ditambahkan parameter
nulls_first
dannulls_last
keExpression.asc()
dandesc()
untuk mengendalikan urutan dari nilai-nilai null. - Pernyataan
F
baru metodebitleftshift()
danbitrightshift()
mengizinkan bitwise shift operations. - Ditambahkan
QuerySet.union()
,intersection()
, dandifference()
.
Permintaan dan Tanggapan¶
- Ditambahkan
QueryDict.fromkeys()
. CommonMiddleware
sekarang menyetel kepala tanggapanContent-Length
untuk tanggapan bukan-aliran.- Ditambahkan pengaturan
SECURE_HSTS_PRELOAD
untuk mengizinkan menambahkan petunjukpreload
ke kepalaStrict-Transport-Security
. ConditionalGetMiddleware
sekarang menambahkan kepalaETag
pada tanggapan.
Serialisasi¶
- Atribut
django.core.serializers.base.Serializer.stream_class
baru mengizinkan subkelas untuk menyesuaiakan aliran awalan. - Penyandi digunakan oleh JSON serializer 1 dapat disesuaikan dengan melewatkan argumen katakunci
cls
pada fungsiserializers.serialize()
. DjangoJSONEncoder
sekarang menserialkan obyektimedelta
(digunakan olehDurationField
).
Templat¶
mark_safe()
sekarang dapat digunakan sebagai penghias.- Backend cetakan
Jinja2
sekarang mendukung pengolah konteks dengan mengatur pilihan'context_processors'
dalamOPTIONS 1
. - Etiket
regroup
sekarang mengembalikannamedtuple
daripada dictionay sehingga anda dapat mengeluarkan kelompok obyek langsung dalam putaran, sebagai contoh{% for grouper, list in regrouped %}
. - Ditambahkan etiket cetakan
resetcycle
untuk mengizinkan mengatur kembali urutan dari etiket cetakancycle
. - Anda sekarang dapat menentukan direktori khusus untuk
filesystem.Loader
tertentu.
Pengujian¶
- Ditambahkan
DiscoverRunner.get_test_runner_kwargs()
untuk mengizinkan penyesuaian argumen katakunci dilewatkan ke penjalan percobaan. - Ditambahkan pilihan
test --debug-mode
untuk membantu memecahkan masalah kegagalan percobaan dengan mengatur pengaturanDEBUG
menjadiTrue
. 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
. DiscoverRunner
sekarang menjalankan pemeriksaan sistem pada awal dari penjalanan percobaan. Timpa metodeDiscoverRunner.run_checks()
jika anda ingin meniadakan itu.
Pengesah¶
- Ditambahkan
FileExtensionValidator
untuk mensahkan berkas tambahan danvalidate_image_file_extension
untuk 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.gis
terbitan pertama, GDAL sekarang membutuhkan ketergantungan untuk GeoDjango. Dalam versi terlama, itu hanya dibutuhkan untuk SQLite. contrib.gis.maps
dipindahkan 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
GEOSGeometry
sekarang juga membandingkan SRID. - Widget formulir berdasarkan-OpenLayer sekarang menggunakan OpenLayer 3, dan cetakan
gis/openlayers.html
dangis/openlayers-osm.html
telah 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.widgets
danOpenLayersWidget
admin 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
¶
collectstatic
mungkin 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 memunculkanValueError
daripada mengembalikan jalur tidak berubah. Anda dapat merubah ke perilaku lama dengan mengaturManifestStaticFilesStorage.manifest_strict
menjadiFalse
.
API backend basisdata¶
Bagian ini menjelaskan perubahan yang mungkin diperlukan oleh backend basis data pihak ketiga.
- Metode
DatabaseOperations.time_trunc_sql()
ditambahkan untuk mendukung pemotonganTimeField
. Itu menerima argumenlookup_type
danfield_name
dan mengembalikan SQL sesuai untuk memotong bidang waktu yang diberikan pada sebuah obyek waktu dengan hanya diberikan kekhususan. Argumenlookup_type
dapat salsah satu'hour'
,'minute'
, atau'second'
. - Metode
DatabaseOperations.datetime_cast_time_sql()
ditambahkan untuk mendukung pencariantime
. Itu menerima argumenfield_name
dantzname
dan 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
. - The new
DatabaseFeatures.supports_index_column_ordering
attribute specifies if a database allows defining ordering for columns in indexes. The default value isTrue
and theDatabaseIntrospection.get_constraints()
method should include an'orders'
key in each of the returned dictionaries with a list of'ASC'
and/or'DESC'
values corresponding to the ordering of each column in the index. inspectdb
tidak 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_case
untukignores_table_name_case
untuk lebih akurat mencerminkan bagaimana itu digunakan. - Argumen kata kunci
name
ditambahkan 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 pada perilaku tidak umum digunakan dan sangat bermanfaat. Jika anda ingin otomatis mengenali 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:
SubWidget
RendererMixin
,ChoiceFieldRenderer
,RadioFieldRenderer
,CheckboxFieldRenderer
ChoiceInput
,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.
Kursor sisi-peladen pada PostgreSQL¶
The change to make QuerySet.iterator()
use server-side cursors on
PostgreSQL prevents running Django with pgBouncer in transaction pooling
mode. To reallow that, use the DISABLE_SERVER_SIDE_CURSORS
setting (added in Django 1.11.1) in
DATABASES
.
Lihat Menggabungkan transaksi dan kursor sisi-peladen untuk obrolan lebih.
Bermacam-macam¶
Jika tidak ada barang dalam umpan mempunyai atribut
pubdate
atauupdateddate
,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.csrf
daripadadjango.request
.Pengesahan
ALLOWED_HOSTS
tidak 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_display
menampilan ID obyek terkait. Pindahkan akhiran_id
jika anda ingin perilaku lama dari string mewakili dari obyek.Dalam formulir model,
CharField
dengannull=True
sekarang menyimpan nilaiNULL
daripada string kosong.Pada Oracle,
Model.validate_unique()
tidak lagi memeriksa string kosong untuk keunikan sebagai penafsir basisdata nilai sebagaiNULL
.Jika anda mensubkelaskan
AbstractUser
dan menimpaclean()
, pastikan itu memanggilsuper()
.BaseUserManager.normalize_email()
dipanggil dalam sebuah metodeAbstractUser.clean()
baru sehingga nomarlisasi diberlakukan dalam kasus-kasus seperti pengesahan formulir model.EmailField
danURLField
tidak lagi menerima argumen katakuncistrip
. Pindahkan itu karena itu tidak mempunyai pengaruh dalam versi terlama dari Django ketika bidang ini selalu menghilangkan ruang putih.Atribut
checked
andselected
dibangun 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
DateTimeAwareJSONEncoder
tidak terdokumentasi untukDjangoJSONEncoder
(dinamai kembali dalam Django 1.0) dipindahkan.The
cached template loader
is now enabled ifOPTIONS['loaders']
isn't specified andOPTIONS['debug']
isFalse
(the latter option defaults to the value ofDEBUG
). This could be backwards-incompatible if you have some template tags that aren't thread safe.Penunjukan untuk penghapusan jenis isi basi tidak lagi muncul setelah menjalankan perintah
migrate
. Gunakan perintahremove_stale_contenttypes
baru sebagai gantinya.Widget admin untuk
IntegerField
menggunakantype="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 contohExpires
atauCache-Control
.UpdateCacheMiddleware
danadd_never_cache_headers()
callpatch_response_headers()
dan maka dari itu juga dipengaruhi oleh perubahan ini.Dalam cetakan admin,
1
diganti dengan etiket2
untuk mengizinkan menyertakan daftar didalam teks bantuan.ConditionalGetMiddleware
tidak lagi menyetel kepalaDate
ketika peladen Jaringan menyetel kepala itu. Itu juga tidak lagi menyetel kepalaContent-Length
ketika ini diselesaikan olehCommonMiddleware
.Jika anda mempunyai middleware yang merubah isi tanggapan dan muncul sebelum
CommonMiddleware
dalam pengaturanMIDDLEWARE
atauMIDDLEWARE_CLASSES
, anda harus mengurutkan kembali middleware anda sehingga tanggapan tidak dirubah setelahContent-Length
disetel, atau memiliki tanggapan merubah middleware menyetel kembali kepalaContent-Length
.get_model()
danget_models()
sekarang memunculkanAppRegistryNotReady
jika 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_ready
menjadiFalse
.Atribut
BaseCommand.can_import_settings
tidak digunakan dipindahkan.Internal
django.utils.functional.lazy_property
dipindahkan.Untuk ketetapan dengan permintaan bukan-banyak-bagian,
MultiPartParser.parse()
sekarang meninggalkanrequest.POST
kekal. Jika anda sedang merubahQueryDict
itu, 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, **kwargs
menjadibase_attrs, extra_attrs=None
.Obyek seperti-berkas (sebagai contoh
StringIO
danBytesIO
) diunggah pada sebuahImageField
menggunakan klien percobaan sekarang membutuhkan sebuah atributname
dengan sebuah nilai yang melewatkan pengesahvalidate_image_file_extension
. Lihat catatan dalamClient.post()
.FileField
now moves rather than copies the file it receives. With the default file upload settings, files larger thanFILE_UPLOAD_MAX_MEMORY_SIZE
now have the same permissions as temporary files (often0o600
) rather than the system's standard umask (often0o6644
). Set theFILE_UPLOAD_PERMISSIONS
if you need the same permission regardless of file size.
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.auth
diusangkan menduung dari tampilan berdasarkan-kelas baruLoginView
danLogoutView
. - Parameter
extra_context
tidak 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 perilakupylibmc
sebagai atribut tingkat-atas dariOPTIONS
diusangkan. Setel mereka dibawah kuncibehaviors
dalamOPTIONS
sebagai gantinya. - Parameter
host
daridjango.utils.http.is_safe_url()
diusangkan mendukung parameterallowed_hosts
baru. - Mendiamkan pengecualian yang muncul selagi membangun etiket cetakan
{% include %} 1
diusangkan 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 argumenrequest
pada metodeauthenticate()
dari backend autentifikasi. Dukungan untuk metode-metode yang tidak menerimarequest
sebagai argumen penempatan pertama akan dipindahkan dalam Django 2.1.- Pengaturan
USE_ETAGS
diusangkan mendukungConditionalGetMiddleware
yang sekarang menambah kepalaETag
pada tanggapan tanpa memperdulikan pengaturan.CommonMiddleware
dandjango.utils.cache.patch_response_headers()
tidak akan lagi menyetel ETags ketika pengusangan berakhir. Model._meta.has_auto_field
diusangkan 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 membuathandler404
yang mencari karakter huruf besar dalam URL dan pengalihkan ke setara huruf kecil. - Argumen
renderer
ditambahkan pada metodeWidget.render()
. Metode-metode yang tidak menerima bahwa argumen akan bekerja melalui masa pengusangan.