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.
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+.
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.
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.
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.
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
.
django.contrib.admin
¶ModelAdmin.date_hierarchy
sekarang dapat mengacu bidang-bidang terhadap hubungan.ModelAdmin.get_exclude()
baru mengizinkan menentukan bidang-bidang dikecualikan berdasarkan pada permintaan atau instance model.popup_response.html
sekarang dapat ditimpa per aplikasi, per model, atau dengan mengatur atribut ModelAdmin.popup_response_template
.django.contrib.auth
¶LoginView
and LogoutView
menggantikan tampilan berdasarkan-fungsi login()
dan logout()
yang diusangkan.PasswordChangeView
, PasswordChangeDoneView
, PasswordResetView
, PasswordResetDoneView
, PasswordResetConfirmView
, dan PasswordResetCompleteView
menggantikan tampilan berdasarkan-fungsi password_change()
, password_change_done()
, password_reset()
, password_reset_done()
, password_reset_confirm()
, dan password_reset_complete()
yang diusangkan.post_reset_login
baru untuk PasswordResetConfirmView
mengizinkan secara otomatis masuk seorang pengguna setelah berhasil menyetel kembali sandi. Jika anda mempunyai banyak AUTHENTICATION_BACKENDS
dikonfigurasi, gunakan atribut post_reset_login_backend
untuk memilih yang mana satu digunakan.PasswordResetConfirmView
(tetapi bukan tampilan berdasarkan-fungsi password_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.success_url_allowed_hosts
baru untuk LoginView
dan LogoutView
mengizinkan menentukan sekumpulan dari rumah yang aman untuk pengalihan setelah masuk dan keluar.help_text
pada UserCreationForm
.HttpRequest
sekarang dilewatkan ke authenticate()
yang gilirannya melewatkan itu ke backend autentifikasi jika itu menerima sebuah argumen request
.user_login_failed()
sekarang menerima sebuah argumen request
.PasswordResetForm
mendukung penyesuaian pengguna model-model yang menggunakan sebuah bidang surel bernama sesuatu selain 'email'
. Setel CustomUser.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
¶remove_stale_contenttypes
, ada sekarang daftar dari obyek terkait seperti auth.Permission
yang akan juga dihapus. Sebelumnya, hanya jenis isi yang ditampilkan (dan penunjukan ini setelah migrate
daripada dalam perintah terpisah).django.contrib.gis
¶GEOSGeometry.from_gml()
dan OGRGeometry.from_gml()
baru mengizinkan membuat geometri dari GML.dwithin
pada SpatiaLite.Area
, Distance
function, dan pencarian tujuan sekarang bekerja dengan kordinat geodetik pada SpatiaLite.OpenLayers.js
dari https://cdnjs.cloudflare.com
yaitu lebih cocok untuk penggunaan produksi dari pada sumber lama https://openlayers.org/
. Mereka juga memperbaharui untuk menggunakan 3.GDALRaster
.IsValid
, fungsi MakeValid
, dan pencarian isvalid
.AsGML
, fungsi BoundingCircle
, fungsi IsValid
function, dan pencarian isvalid
.django.contrib.postgres
¶distinct
baru untuk StringAgg
ditentukan jika nilai-nilai gabungan akan dibedakan.GinIndex
dan BrinIndex
baru mengizinkan membuat indeks-indeks GIN
dan BRIN
dalam basisdata.JSONField
menerima sebuah parameter encoder
baru untuk menentukan kelas penyesuaian untuk menyandikan jenis-jenis data tidak didukung oleh penyandi standar.CIText
baru dan tindakan perpindahan CITextExtension
mengizinkan menggunakan tambahan citext
PostgreSQL untuk pencarian kasus-tidak-sensitif. Tiga bidang disediakan: CICharField
, CIEmailField
, dan CITextField
.JSONBAgg
baru mengizinkan menggabungkan nilai-nilai sebagai larik JSON.HStoreField
(bidang model) dan HStoreField
(bidang formulir) mengizinkan menyimpan nilai null.OPTIONS 1
sebagai argumen katakunci ke pembangun klien, mengizinkan untuk pengendalian lebih lanjut dari perulaku klien. Lihat dokumentasi cache arguments 2 sebagai contoh.LOCATION 1
, untuk kenyamanan dengan layanan pihak-ketiga yang menggunakan string tersebut dalam variabel lingkungan.CSRF_USE_SESSIONS
untuk mengizinkan menyimpan token CSRF dalam sesi pengguna daripada dalam sebuah kue.skip_locked
pada QuerySet.select_for_update()
pada PostgreSQL 9.5+ dan Oracle untuk menjalankan permintaan dengan FOR UPDATE SKIP LOCKED
.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.'isolation_level'
dalam OPTIONS
untuk mengizinkan menentukan transaction isolation level. Untuk menghindari kemungkinan data hilang, itu dianjurkan untuk mengganti dari tingkat awalan MySQL, pembacaan berulang, untuk membaca diperbaiki.cx_Oracle
5.3.EMAIL_USE_LOCALTIME
untuk mengizinkan mengirimkan kepala tanggal SMTP dalam zona waktu lokal daripada dalam UTC.EmailMessage.attach()
dan attach_file()
kembali ke jenis MIME application/octet-stream` ketika isi biner yang tidak dapat disandikan sebagai UTF-8 ditentukan untuk lampiran text/*
.io.TextIOWrapper
, File
sekarang mempunyai metode readable()
, writable()
, dan seekable()
.CharField.empty_value
baru mengizinkan menentukan nilai Python untuk digunakan untuk mewakili "empty".Form.get_initial_for_field()
baru mengembalikan data inisial untuk sebuah bidang formulir.NUMBER_GROUPING
dukungan pengelompokan angka bukan-seragam.loaddata --exclude
baru mengizinkan tidak menyertakan model dan aplikasi selagi memuat data dari peralatan tetap.diffsettings --default
baru mengizinkan menentukan modul pengaturan selain dari pengaturan awalan Django untuk dibandingkan.app_label
sekarang membatasi keluaran showmigrations --plan
.uuid.UUID
.defaults
dari QuerySet.update_or_create()
dan get_or_create()
.ImageField
sekarang mempunyai pengesah awalan validate_image_file_extension
. (Pengesah ini pindah dari bidang formulir dalam Django 1.11.2.)Trunc
.ExtractWeek
untuk mengambil minggu dari DateField
dan DateTimeField
dan dibuka melalui pencarian week
.TruncTime
untuk memotong DateTimeField
ke komponen waktunya dan dibuka melalui pencarian time
.QuerySet.values()
dan values_list()
.range
.unique=True
dengan FileField
.nulls_first
dan nulls_last
ke Expression.asc()
dan desc()
untuk mengendalikan urutan dari nilai-nilai null.F
baru metode bitleftshift()
dan bitrightshift()
mengizinkan bitwise shift operations.QuerySet.union()
, intersection()
, dan difference()
.QueryDict.fromkeys()
.CommonMiddleware
sekarang menyetel kepala tanggapan Content-Length
untuk tanggapan bukan-aliran.SECURE_HSTS_PRELOAD
untuk mengizinkan menambahkan petunjuk preload
ke kepala Strict-Transport-Security
.ConditionalGetMiddleware
sekarang menambahkan kepala ETag
pada tanggapan.django.core.serializers.base.Serializer.stream_class
baru mengizinkan subkelas untuk menyesuaiakan aliran awalan.cls
pada fungsi serializers.serialize()
.DjangoJSONEncoder
sekarang menserialkan obyek timedelta
(digunakan oleh DurationField
).mark_safe()
sekarang dapat digunakan sebagai penghias.Jinja2
sekarang mendukung pengolah konteks dengan mengatur pilihan 'context_processors'
dalam OPTIONS 1
.regroup
sekarang mengembalikan namedtuple
daripada dictionay sehingga anda dapat mengeluarkan kelompok obyek langsung dalam putaran, sebagai contoh {% for grouper, list in regrouped %}
.resetcycle
untuk mengizinkan mengatur kembali urutan dari etiket cetakan cycle
.filesystem.Loader
tertentu.DiscoverRunner.get_test_runner_kwargs()
untuk mengizinkan penyesuaian argumen katakunci dilewatkan ke penjalan percobaan.test --debug-mode
untuk membantu memecahkan masalah kegagalan percobaan dengan mengatur pengaturan DEBUG
menjadi True
.django.test.utils.setup_databases()
baru (dipindah dari django.test.runner
) dan fungsi teardown_databases()
membuatnya lebih mudah membangun pejalan percobaan penyesuaian.unittest.TestCase.subTest()
ketika menggunakan pilihan test --parallel
.DiscoverRunner
sekarang menjalankan pemeriksaan sistem pada awal dari penjalanan percobaan. Timpa metode DiscoverRunner.run_checks()
jika anda ingin meniadakan itu.FileExtensionValidator
untuk mensahkan berkas tambahan dan validate_image_file_extension
untuk mensahkan berkas-berkas gambar.django.contrib.gis
¶contrib.gis
terbitan pertama, GDAL sekarang membutuhkan ketergantungan untuk GeoDjango. Dalam versi terlama, itu hanya dibutuhkan untuk SQLite.contrib.gis.maps
is removed as it interfaces with a retired version of
the Google Maps API and seems to be unmaintained. If you're using it,
let us know.GEOSGeometry
sekarang juga membandingkan SRID.gis/openlayers.html
dan gis/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.contrib.gis.forms.widgets
dan OpenLayersWidget
admin menggunakan form rendering API 1 daripada daripada loader.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 pembangun TemplatesSetting
.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 menggunakan ManifestStaticFilesStorage.max_post_process_passes
.ManifestStaticFilesStorage
, berkas-berkas statis tidak ditemukan dalam manifest pada waktu berjalan sekarang memunculkan ValueError
daripada mengembalikan jalur tidak berubah. Anda dapat merubah ke perilaku lama dengan mengatur ManifestStaticFilesStorage.manifest_strict
menjadi False
.Bagian ini menjelaskan perubahan yang mungkin diperlukan oleh backend basis data pihak ketiga.
DatabaseOperations.time_trunc_sql()
ditambahkan untuk mendukung pemotongan TimeField
. Itu menerima argumen lookup_type
dan field_name
dan mengembalikan SQL sesuai untuk memotong bidang waktu yang diberikan pada sebuah obyek waktu dengan hanya diberikan kekhususan. Argumen lookup_type
dapat salsah satu 'hour'
, 'minute'
, atau 'second'
.DatabaseOperations.datetime_cast_time_sql()
ditambahkan untuk mendukung pencarian time
. Itu menerima argumen field_name
dan tzname
dan mengembalikan SQL yang dibutuhkan untuk membuang nilai datetime menjadi nilai waktu.FOR UPDATE SKIP LOCKED
, setel DatabaseFeatures.has_select_for_update_skip_locked = True
.DatabaseFeatures.supports_index_column_ordering
attribute
specifies if a database allows defining ordering for columns in indexes. The
default value is True
and the DatabaseIntrospection.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 memanggil DatabaseIntrospection.get_indexes()
yang diusangkan. Backend basisdata penyesuaian harus memastikan semua jenis dari indeks dikembalikan oleh DatabaseIntrospection.get_constraints()
.ignores_quoted_identifier_case
untuk ignores_table_name_case
untuk lebih akurat mencerminkan bagaimana itu digunakan.name
ditambahkan ke metode DatabaseWrapper.create_cursor(self, name=None)
untuk mengizinkan penggunaan dari kursor sisi-peladen pada backend yang mendukung itu.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.
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.
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
.
<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.
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.
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.
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.
Jika tidak ada barang dalam umpan mempunyai atribut pubdate
atau updateddate
, 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
daripada django.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 dalam ALLOWED_HOSTS
. Lihat Tests and multiple host names.
Menggunakan id foreign key (sebagai contoh 'field_id'
) dalam ModelAdmin.list_display
menampilan ID obyek terkait. Pindahkan akhiran _id
jika anda ingin perilaku lama dari string mewakili dari obyek.
Dalam formulir model, CharField
dengan null=True
sekarang menyimpan nilai NULL
daripada string kosong.
Pada Oracle, Model.validate_unique()
tidak lagi memeriksa string kosong untuk keunikan sebagai penafsir basisdata nilai sebagai NULL
.
Jika anda mensubkelaskan AbstractUser
dan menimpa clean()
, pastikan itu memanggil super()
. BaseUserManager.normalize_email()
dipanggil dalam sebuah metode AbstractUser.clean()
baru sehingga nomarlisasi diberlakukan dalam kasus-kasus seperti pengesahan formulir model.
EmailField
dan URLField
tidak lagi menerima argumen katakunci strip
. Pindahkan itu karena itu tidak mempunyai pengaruh dalam versi terlama dari Django ketika bidang ini selalu menghilangkan ruang putih.
Atribut checked
and selected
dibangun dengan widget formulir sekarang menggunakan sintaksis boolean HTML5 daripada checked='checked'
and selected='selected'
XHTML.
RelatedManager.add()
, remove()
, clear()
, dan set()
sekarang membersihkan cache prefetch_related()
.
Untuk mencegah kemungkinan kehilangan dari pengaturan disimpan, setup_test_environment()
sekarang memunculkan sebuah pengecualian jika dipanggil satu detik sebelum memanggil teardown_test_environment()
.
Nama lain DateTimeAwareJSONEncoder
tidak terdokumentasi untuk DjangoJSONEncoder
(dinamai kembali dalam Django 1.0) dipindahkan.
The cached template loader
is now enabled if OPTIONS['loaders']
isn't
specified and OPTIONS['debug']
is False
(the latter option defaults to the value of DEBUG
). 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 perintah remove_stale_contenttypes
baru sebagai gantinya.
Widget admin untuk IntegerField
menggunakan type="number"
daripada type="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 kepala Last-Modified
. Menurut RFC 7234#section-4.2.2, kepala ini tidak berguna bersama kepala cache lain yang menyediakan sebuah waktu kadaluarsa yang jelas, sebagai contoh Expires
atau Cache-Control
. UpdateCacheMiddleware
dan add_never_cache_headers()
call patch_response_headers()
dan maka dari itu juga dipengaruhi oleh perubahan ini.
Dalam cetakan admin, 1
diganti dengan etiket 2
untuk mengizinkan menyertakan daftar didalam teks bantuan.
ConditionalGetMiddleware
tidak lagi menyetel kepala Date
ketika peladen Jaringan menyetel kepala itu. Itu juga tidak lagi menyetel kepala Content-Length
ketika ini diselesaikan oleh CommonMiddleware
.
Jika anda mempunyai middleware yang merubah isi tanggapan dan muncul sebelum CommonMiddleware
dalam pengaturan MIDDLEWARE
atau MIDDLEWARE_CLASSES
, anda harus mengurutkan kembali middleware anda sehingga tanggapan tidak dirubah setelah Content-Length
disetel, atau memiliki tanggapan merubah middleware menyetel kembali kepala Content-Length
.
get_model()
dan get_models()
sekarang memunculkan AppRegistryNotReady
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 dari get_model()
, setel argumen require_ready
menjadi False
.
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 meninggalkan request.POST
kekal. Jika anda sedang merubah QueryDict
itu, anda harus sekarang pertama menyalin, sebagai contoh request.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 dari extra_attrs=None, **kwargs
menjadi base_attrs, extra_attrs=None
.
Obyek seperti-berkas (sebagai contoh StringIO
dan BytesIO
) diunggah pada sebuah ImageField
menggunakan klien percobaan sekarang membutuhkan sebuah atribut name
dengan sebuah nilai yang melewatkan pengesah validate_image_file_extension
. Lihat catatan dalam Client.post()
.
FileField
now moves rather than copies the file
it receives. With the default file upload settings, files larger than
FILE_UPLOAD_MAX_MEMORY_SIZE
now have the same permissions as
temporary files (often 0o600
) rather than the system's standard umask
(often 0o6644
). Set the FILE_UPLOAD_PERMISSIONS
if you need
the same permission regardless of file size.
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])
login()
dan logout()
contrib.auth
diusangkan menduung dari tampilan berdasarkan-kelas baru LoginView
dan LogoutView
.extra_context
tidak digunakan dari contrib.auth.views.logout_then_login()
diusangkan.contrib.auth
’s password_change()
, password_change_done()
, password_reset()
, password_reset_done()
, password_reset_confirm()
, dan password_reset_complete()
diusangkan mendukung dari tampilan berdasarkan-kelas baru PasswordChangeView
, PasswordChangeDoneView
, PasswordResetView
, PasswordResetDoneView
, PasswordResetConfirmView
, dan PasswordResetCompleteView
.django.test.runner.setup_databases()
dipindahkan ke django.test.utils.setup_databases()
. Tempat lama diusangkan.django.utils.translation.string_concat()
diusangkan mendukung django.utils.text.format_lazy()
. string_concat(*strings)
dapat diganti oleh format_lazy('{}' * len(strings), *strings)
.PyLibMCCache
, lewatkan pengaturan perilaku pylibmc
sebagai atribut tingkat-atas dari OPTIONS
diusangkan. Setel mereka dibawah kunci behaviors
dalam OPTIONS
sebagai gantinya.host
dari django.utils.http.is_safe_url()
diusangkan mendukung parameter allowed_hosts
baru.{% include %} 1
diusangkan sebagai perilaku sering lebih membingungkan daripada membantu. Dalam Django 2.1, pengecualian akan dimunculkan.DatabaseIntrospection.get_indexes()
diusangkan mendukung DatabaseIntrospection.get_constraints()
.authenticate()
sekarang melewatkan sebuah argumen request
pada metode authenticate()
dari backend autentifikasi. Dukungan untuk metode-metode yang tidak menerima request
sebagai argumen penempatan pertama akan dipindahkan dalam Django 2.1.USE_ETAGS
diusangkan mendukung ConditionalGetMiddleware
yang sekarang menambah kepala ETag
pada tanggapan tanpa memperdulikan pengaturan. CommonMiddleware
dan django.utils.cache.patch_response_headers()
tidak akan lagi menyetel ETags ketika pengusangan berakhir.Model._meta.has_auto_field
diusangkan mendukung dari pemeriksaan jika Model._meta.auto_field bukan None
.iLmsu#
dalam url()
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 membuat handler404
yang mencari karakter huruf besar dalam URL dan pengalihkan ke setara huruf kecil.renderer
ditambahkan pada metode Widget.render()
. Metode-metode yang tidak menerima bahwa argumen akan bekerja melalui masa pengusangan.Des 02, 2019