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

django.contrib.auth

  • Hitungan perulangan awalan untuk pencampur sandi PBKDF2 meningkat sebesar 20%.
  • Tampilan berdasarkan-kelas LoginView and LogoutView menggantikan tampilan berdasarkan-fungsi login() dan logout() yang diusangkan.
  • Tampilan berdasarkan-kelas The 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.
  • Atribut 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.
  • 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-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.
  • Atribut success_url_allowed_hosts baru untuk LoginView dan LogoutView mengizinkan menentukan sekumpulan dari rumah yang aman untuk pengalihan setelah masuk dan keluar.
  • Ditambahkan pengesah sandi help_text pada UserCreationForm.
  • HttpRequest sekarang dilewatkan ke authenticate() yang gilirannya melewatkan itu ke backend autentifikasi jika itu menerima sebuah argumen request.
  • Sinyal 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

  • Ketika jenis isi basi dikenali dalam perintah 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

  • Metode GEOSGeometry.from_gml() dan OGRGeometry.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 dari https://cdnjs.cloudflare.com yaitu lebih cocok untuk penggunaan produksi dari pada sumber lama https://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, fungsi MakeValid, dan pencarian isvalid.
  • Ditambahkan dukungan Oracle untuk fungsi AsGML, fungsi BoundingCircle, fungsi IsValid function, dan pencarian isvalid.

django.contrib.postgres

  • Argumen distinct baru untuk StringAgg ditentukan jika nilai-nilai gabungan akan dibedakan.
  • Kelas-kelas 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.
  • Mixin 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.

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 pada QuerySet.select_for_update() pada PostgreSQL 9.5+ dan Oracle untuk menjalankan permintaan dengan FOR 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' 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.
  • 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() dan attach_file() kembali ke jenis MIME application/octet-stream` ketika isi biner yang tidak dapat disandikan sebagai UTF-8 ditentukan untuk lampiran text/*.

Penyimpanan Berkas

  • Untuk membuatnya dapat dibungkus oleh io.TextIOWrapper, File sekarang mempunyai metode readable(), writable(), dan seekable().

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 keluaran showmigrations --plan.

Perpindahan

  • Ditambahkan dukungan untuk serialisasi dari obyek uuid.UUID.

Model

Permintaan dan 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 fungsi serializers.serialize().
  • DjangoJSONEncoder sekarang menserialkan obyek timedelta (digunakan oleh DurationField).

Templat

  • mark_safe() sekarang dapat digunakan sebagai penghias.
  • Backend cetakan Jinja2 sekarang mendukung pengolah konteks dengan mengatur pilihan 'context_processors' dalam OPTIONS 1.
  • Etiket regroup sekarang mengembalikan namedtuple 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 cetakan cycle.
  • Anda sekarang dapat menentukan direktori khusus untuk filesystem.Loader tertentu.

Pengujian

Pengesah

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 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.
  • Dukungan untuk SpatiaLite < 4.0 telah dibuang.
  • Dukungan untuk GDAL 1.7 dan 1.8 telah dibuang.
  • Widget dalam 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.
  • Ketika menggunakan 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.

API backend basisdata

Bagian ini menjelaskan perubahan yang mungkin diperlukan oleh backend basis data pihak ketiga.

  • Metode 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'.
  • Metode 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.
  • Untuk mengadakan dukungan FOR UPDATE SKIP LOCKED, setel DatabaseFeatures.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 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().
  • Namai kembali fitur ignores_quoted_identifier_case untuk ignores_table_name_case untuk lebih akurat mencerminkan bagaimana itu digunakan.
  • Argumen kata kunci name ditambahkan ke metode DatabaseWrapper.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 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.

Fitur-fitur diusangkan dalam 1.11

Bermacam-macam

  • Tampilan berdasarkan-fungsi login() dan logout() contrib.auth diusangkan menduung dari tampilan berdasarkan-kelas baru LoginView dan LogoutView.
  • Parameter extra_context tidak digunakan dari contrib.auth.views.logout_then_login() diusangkan.
  • Tampilan berdasarkan-fungsi 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).
  • Untuk backend cache PyLibMCCache, lewatkan pengaturan perilaku pylibmc sebagai atribut tingkat-atas dari OPTIONS diusangkan. Setel mereka dibawah kunci behaviors dalam OPTIONS sebagai gantinya.
  • Parameter host dari django.utils.http.is_safe_url() diusangkan mendukung parameter allowed_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 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.
  • Pengaturan 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.
  • Menggunakan kelompok regular expression dengan 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.
  • Argumen renderer ditambahkan pada metode Widget.render(). Metode-metode yang tidak menerima bahwa argumen akan bekerja melalui masa pengusangan.
Back to Top