# Dokumentasi Django 6.0.7

# 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 Bagaimana meningkatkan Django ke versi terbaru jika anda sedang memperbaharui proyek yang ada.

Django 1.11 is designated as a long-term support release. It will receive security updates for at least three years after its release. Support for the previous LTS, Django 1.8, will end in 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`.

The `Index` class creates a b-tree index, as if you used `db_index` on the model field or `index_together` on the model `Meta` class. It can be subclassed to support different index types, such as `GinIndex`. It also allows defining the order (ASC/DESC) for the columns of the index.

### 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 atribut `ModelAdmin.popup_response_template`.

#### `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.

- Menambahkan kemampuan untuk memberikan parameter `size`, `shape`, dan `offset` ketika membuat objek `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.

- `django.contrib.postgres.fields.JSONField` accepts a new `encoder` parameter to specify a custom class to encode data types not supported by the standard encoder.

- The new `CIText` mixin and `CITextExtension` migration operation allow using PostgreSQL's `citext` extension for case-insensitive lookups. Three fields are provided: `CICharField`, `CIEmailField`, and `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

- Added the `skip_locked` argument to `QuerySet.select_for_update()` on PostgreSQL 9.5+ and Oracle to execute queries with `FOR UPDATE SKIP LOCKED`.

- Ditambahkan pengaturan `TEST['TEMPLATE']` untuk membuat pengguna PostgreSQL menentukan sebuah cetakan untuk membuat basisdata percobaan.

- `QuerySet.iterator()` now uses server-side cursors on PostgreSQL. This feature transfers some of the worker memory load (used to hold query results) to the database and might increase database memory usage.

- 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()` and `attach_file()` now fall back to MIME type application/octet-stream when binary content that can't be decoded as UTF-8 is specified for a text/* attachment.

#### Penyimpanan Berkas

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

#### Formulir

- The new `empty_value` attribute on `CharField`, `EmailField`, `RegexField`, `SlugField`, and `URLField` allows specifying the Python value to use to represent "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 keluaran `showmigrations --plan`.

#### Perpindahan

- Ditambahkan dukungan untuk serialisasi dari obyek `uuid.UUID`.

#### Model

- Ditambahkan dukungan untuk nilai dapat dipanggil dalam argumen `defaults` dari `QuerySet.update_or_create()` dan `get_or_create()`.

- `ImageField` now has a default `validate_image_file_extension` validator. (This validator moved to the form field in Django 1.11.2.)

- Ditambahkan dukungan untuk pemotongan waktu pada fungsi-fungsi `Trunc`.

- Ditambahkan fungsi `ExtractWeek` untuk mengambil minggu dari `DateField` dan `DateTimeField` dan dibuka melalui pencarian `week`.

- Ditambahkan fungsi `TruncTime` untuk memotong `DateTimeField` ke komponen waktunya dan dibuka melalui pencarian `time`.

- Ditambahkan dukungan untuk pernyataan dalam `QuerySet.values()` dan `values_list()`.

- Ditambahkan dukungan untuk pernyataan permintaan yang mengambil banyak argumen, seperti `range`.

- Anda dapat sekarang menggunakan pilihan `unique=True` dengan `FileField`.

- Ditambahkan parameter `nulls_first` dan `nulls_last` ke `Expression.asc()` dan `desc()` untuk mengendalikan urutan dari nilai-nilai null.

- Pernyataan `F` baru metode `bitleftshift()` dan `bitrightshift()` mengizinkan bitwise shift operations.

- Ditambahkan `QuerySet.union()`, `intersection()`, dan `difference()`.

#### Permintaan dan Tanggapan

- Ditambahkan `QueryDict.fromkeys()`.

- `CommonMiddleware` sekarang menyetel kepala tanggapan `Content-Length` untuk tanggapan bukan-aliran.

- Ditambahkan pengaturan `SECURE_HSTS_PRELOAD` untuk mengizinkan menambahkan petunjuk `preload` ke kepala `Strict-Transport-Security`.

- `ConditionalGetMiddleware` sekarang menambahkan kepala `ETag` 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 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

- 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 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.

- Ditambahkan dukungan untuk `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.

#### Pengesah

- Ditambahkan `FileExtensionValidator` untuk mensahkan berkas tambahan dan `validate_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` 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.

- 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.

Support for `settings.TIME_ZONE = None` is removed as the behavior isn't commonly used and is questionably useful. If you want to automatically detect the timezone based on the system timezone, you can use tzlocal:

    from tzlocal import get_localzone

    TIME_ZONE = get_localzone().zone

This works similar to `settings.TIME_ZONE = None` except that it also sets `os.environ['TZ']`. Let us know if there's a use case where you find you can't adapt your code to set a `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` no longer sets the `Date` header as web servers set that header. It also no longer sets the `Content-Length` header as this is now done by `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

### 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()` 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.