---
title: "Catatan terbitan Django 1.11"
version: 2.0
locale: id
source: https://docs.djangoproject.com/id/2.0/releases/1.11/
canonical: https://djangodocs.dev/id/2.0/releases/1.11/
---
# Catatan terbitan Django 1.11

*4 April 2017*

Selamat datang di Django 1.11!

Catatan terbitan ini mencangkup [new features](#whats-new-1-11), sama halnya beberapa [backwards incompatible changes](#backwards-incompatible-1-11) anda akan ingin waspadai ketika meningkatkan dari Django 1.10 atau versi terlama. Kami telah [begun the deprecation process for some features](#deprecated-features-1-11).

Lihat panduan [Meningkatkan Django ke versi terbaru](/id/2.0/howto/upgrade-version/) jika anda sedang memperbaharui proyek yang ada.

Django 1.11 dirancang sebagai [long-term support release](/id/2.0/internals/release-process/#term-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 requires Python 2.7, 3.4, 3.5, 3.6, or 3.7 (as of 1.11.17). We
**highly recommend** and only officially support the latest release of each
series.

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`](/id/2.0/ref/models/indexes/#module-django.db.models.indexes) baru mengandung kelas-kelas yang memudahkan membuat indeks basisdata. Indeks-indeks ditambahkan ke model-model menggunakan pilihan [`Meta.indexes`](/id/2.0/ref/models/options/#django.db.models.Options.indexes).

Kelas [`Index`](/id/2.0/ref/models/indexes/#django.db.models.Index) membuat sebuah indeks b-tree, seolah-olah anda menggunakan [`db_index`](/id/2.0/ref/models/fields/#django.db.models.Field.db_index) pada bidang model atau [`index_together`](/id/2.0/ref/models/options/#django.db.models.Options.index_together) pada model kelas `Meta`. Itu dapat disubkelaskan untuk mendukung jenis-jenis indeks berbeda, seperti [`GinIndex`](/id/2.0/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.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](/id/2.0/ref/forms/renderers/).

Anda mungkin butuh menyesuaikan widget penyesuaian apapun yang anda telah tulis untuk sedikit [backwards incompatible changes](#template-widget-incompatibilities-1-11).

### Ungkapan `Subquery`

Pernyataan basisdata [`Subquery`](/id/2.0/ref/models/expressions/#django.db.models.Subquery) and [`Exists`](/id/2.0/ref/models/expressions/#django.db.models.Exists) baru mengizinkan membuat sub permintaan jelas. Sub permintaan mungkin mengacu ke bidang-bidang dari queryset terluar menggunakan kelas [`OuterRef`](/id/2.0/ref/models/expressions/#django.db.models.OuterRef).

### Fitur kecil

#### [`django.contrib.admin`](/id/2.0/ref/contrib/admin/#module-django.contrib.admin)

- [`ModelAdmin.date_hierarchy`](/id/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.date_hierarchy) sekarang dapat mengacu bidang-bidang terhadap hubungan.
- Kaitan [`ModelAdmin.get_exclude()`](/id/2.0/ref/contrib/admin/#django.contrib.admin.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`](/id/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.popup_response_template).

#### [`django.contrib.auth`](/id/2.0/topics/auth/#module-django.contrib.auth)

- Hitungan perulangan awalan untuk pencampur sandi PBKDF2 meningkat sebesar 20%.
- Tampilan berdasarkan-kelas [`LoginView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.LoginView) and [`LogoutView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.LogoutView) menggantikan tampilan berdasarkan-fungsi `login()` dan `logout()` yang diusangkan.
- Tampilan berdasarkan-kelas The [`PasswordChangeView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordChangeView), [`PasswordChangeDoneView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordChangeDoneView), [`PasswordResetView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordResetView), [`PasswordResetDoneView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordResetDoneView), [`PasswordResetConfirmView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordResetConfirmView), dan [`PasswordResetCompleteView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.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`](/id/2.0/topics/auth/default/#django.contrib.auth.views.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`](/id/2.0/topics/auth/default/#django.contrib.auth.views.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()`](/id/2.0/topics/auth/default/#django.contrib.auth.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`](/id/2.0/topics/auth/default/#django.contrib.auth.views.LoginView) dan [`LogoutView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.LogoutView) mengizinkan menentukan sekumpulan dari rumah yang aman untuk pengalihan setelah masuk dan keluar.
- Ditambahkan pengesah sandi `help_text` pada [`UserCreationForm`](/id/2.0/topics/auth/default/#django.contrib.auth.forms.UserCreationForm).
- `HttpRequest` sekarang dilewatkan ke [`authenticate()`](/id/2.0/topics/auth/default/#django.contrib.auth.authenticate) yang gilirannya melewatkan itu ke backend autentifikasi jika itu menerima sebuah argumen `request`.
- Sinyal [`user_login_failed()`](/id/2.0/ref/contrib/auth/#django.contrib.auth.signals.user_login_failed) sekarang menerima sebuah argumen `request`.
- [`PasswordResetForm`](/id/2.0/topics/auth/default/#django.contrib.auth.forms.PasswordResetForm) mendukung penyesuaian pengguna model-model yang menggunakan sebuah bidang surel bernama sesuatu selain `'email'`. Setel [`CustomUser.EMAIL_FIELD`](/id/2.0/topics/auth/customizing/#django.contrib.auth.models.CustomUser.EMAIL_FIELD) ke nama dari bidang.
- [`get_user_model()`](/id/2.0/topics/auth/customizing/#django.contrib.auth.get_user_model) sekarang dapat dipanggil pada waktu impor, bahkan dalam modeul-modul yang menentukan model-model.

#### [`django.contrib.contenttypes`](/id/2.0/ref/contrib/contenttypes/#module-django.contrib.contenttypes)

- Ketika jenis isi basi dikenali dalam perintah [`remove_stale_contenttypes`](/id/2.0/ref/django-admin/#django-admin-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`](/id/2.0/ref/contrib/gis/#module-django.contrib.gis)

- Metode [`GEOSGeometry.from_gml()`](/id/2.0/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry.from_gml) dan [`OGRGeometry.from_gml()`](/id/2.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.OGRGeometry.from_gml) baru mengizinkan membuat geometri dari GML.
- Ditambahkan dukungan untuk pencarian [`dwithin`](/id/2.0/ref/contrib/gis/geoquerysets/#std-fieldlookup-dwithin) pada SpatiaLite.
- Fungsi [`Area`](/id/2.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.Area), [`Distance`](/id/2.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.Distance) function, dan pencarian tujuan sekarang bekerja dengan kordinat geodetik pada SpatiaLite.
- Widget bentuk berdasarkan-OpenLayer sekarang menggunakan `OpenLayers.js` dari `https://cdnjs.cloudflare.com` yang lebih cocok untuk penggunaan produksi daripada sumber `http://openlayers.org` lama. Mereka juga diperbaharui untuk menggunakan OpenLayers 3.
- Perpindahan PostGIS sekarang dapat merubah bidang dimensi.
- Ditambahkan kemampuan melewatkan parameter size, shape, dan offset ketika memuat obyek [`GDALRaster`](/id/2.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALRaster).
- Ditambahkan dukungan SpatiaLite untuk fungsi [`IsValid`](/id/2.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.IsValid), fungsi [`MakeValid`](/id/2.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.MakeValid), dan pencarian [`isvalid`](/id/2.0/ref/contrib/gis/geoquerysets/#std-fieldlookup-isvalid).
- Ditambahkan dukungan Oracle untuk fungsi [`AsGML`](/id/2.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.AsGML), fungsi [`BoundingCircle`](/id/2.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.BoundingCircle), fungsi [`IsValid`](/id/2.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.IsValid) function, dan pencarian [`isvalid`](/id/2.0/ref/contrib/gis/geoquerysets/#std-fieldlookup-isvalid).

#### [`django.contrib.postgres`](/id/2.0/ref/contrib/postgres/#module-django.contrib.postgres)

- Argumen `distinct` baru untuk [`StringAgg`](/id/2.0/ref/contrib/postgres/aggregates/#django.contrib.postgres.aggregates.StringAgg) ditentukan jika nilai-nilai gabungan akan dibedakan.
- Kelas-kelas [`GinIndex`](/id/2.0/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GinIndex) dan [`BrinIndex`](/id/2.0/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.BrinIndex) baru mengizinkan membuat indeks-indeks `GIN` dan `BRIN` dalam basisdata.
- [`JSONField`](/id/2.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.JSONField) menerima sebuah parameter `encoder` baru untuk menentukan kelas penyesuaian untuk menyandikan jenis-jenis data tidak didukung oleh penyandi standar.
- Mixin [`CIText`](/id/2.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.CIText) baru dan tindakan perpindahan [`CITextExtension`](/id/2.0/ref/contrib/postgres/operations/#django.contrib.postgres.operations.CITextExtension) mengizinkan menggunakan tambahan `citext` PostgreSQL untuk pencarian kasus-tidak-sensitif. Tiga bidang disediakan: [`CICharField`](/id/2.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.CICharField), [`CIEmailField`](/id/2.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.CIEmailField), dan [`CITextField`](/id/2.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.CITextField).
- [`JSONBAgg`](/id/2.0/ref/contrib/postgres/aggregates/#django.contrib.postgres.aggregates.JSONBAgg) baru mengizinkan menggabungkan nilai-nilai sebagai larik JSON.
- [`HStoreField`](/id/2.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.HStoreField) (bidang model) dan [`HStoreField`](/id/2.0/ref/contrib/postgres/forms/#django.contrib.postgres.forms.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`](/id/2.0/ref/settings/#std-setting-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()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update) pada  PostgreSQL 9.5+ dan Oracle untuk menjalankan permintaan dengan `FOR UPDATE SKIP LOCKED`.
- Ditambahkan pengaturan [`TEST['TEMPLATE']`](/id/2.0/ref/settings/#std-setting-TEST_TEMPLATE) untuk membuat pengguna PostgreSQL menentukan sebuah cetakan untuk membuat basisdata percobaan.
- [`QuerySet.iterator()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.iterator) sekarang menggunakan [server-side cursors](https://www.psycopg.org/docs/usage.html#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`](/id/2.0/ref/settings/#std-setting-OPTIONS) untuk mengizinkan menentukan [transaction isolation level](/id/2.0/ref/databases/#mysql-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`](/id/2.0/ref/settings/#std-setting-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`](https://docs.python.org/3/library/io.html#io.TextIOWrapper), [`File`](/id/2.0/ref/files/file/#django.core.files.File) sekarang mempunyai metode `readable()`, `writable()`, dan `seekable()`.

#### Formulir

- Atribut [`CharField.empty_value`](/id/2.0/ref/forms/fields/#django.forms.CharField.empty_value) baru mengizinkan menentukan nilai Python untuk digunakan untuk mewakili "empty".
- Metode [`Form.get_initial_for_field()`](/id/2.0/ref/forms/api/#django.forms.Form.get_initial_for_field) baru mengembalikan data inisial untuk sebuah bidang formulir.

#### Internasionalisasi

- Pembentukan angka dan pengaturan [`NUMBER_GROUPING`](/id/2.0/ref/settings/#std-setting-NUMBER_GROUPING) dukungan pengelompokan angka bukan-seragam.

#### Pengelolaan perintah

- Pilihan [`loaddata --exclude`](/id/2.0/ref/django-admin/#cmdoption-loaddata-exclude) baru mengizinkan tidak menyertakan model dan aplikasi selagi memuat data dari peralatan tetap.
- Pilihan [`diffsettings --default`](/id/2.0/ref/django-admin/#cmdoption-diffsettings-default) baru mengizinkan menentukan modul pengaturan selain dari pengaturan awalan Django untuk dibandingkan.
- Argumen `app_label` sekarang membatasi keluaran [`showmigrations --plan`](/id/2.0/ref/django-admin/#cmdoption-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()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.update_or_create) dan [`get_or_create()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create).
- [`ImageField`](/id/2.0/ref/models/fields/#django.db.models.ImageField) sekarang mempunyai pengesah awalan [`validate_image_file_extension`](/id/2.0/ref/validators/#django.core.validators.validate_image_file_extension). (Pengesah ini pindah dari bidang formulir dalam [Django 1.11.2](/id/2.0/releases/1.11.2/).)
- Ditambahkan dukungan untuk pemotongan waktu pada fungsi-fungsi [`Trunc`](/id/2.0/ref/models/database-functions/#django.db.models.functions.Trunc).
- Ditambahkan fungsi [`ExtractWeek`](/id/2.0/ref/models/database-functions/#django.db.models.functions.ExtractWeek) untuk mengambil minggu dari [`DateField`](/id/2.0/ref/models/fields/#django.db.models.DateField) dan [`DateTimeField`](/id/2.0/ref/models/fields/#django.db.models.DateTimeField) dan dibuka melalui pencarian [`week`](/id/2.0/ref/models/querysets/#std-fieldlookup-week).
- Ditambahkan fungsi [`TruncTime`](/id/2.0/ref/models/database-functions/#django.db.models.functions.TruncTime) untuk memotong [`DateTimeField`](/id/2.0/ref/models/fields/#django.db.models.DateTimeField) ke komponen waktunya dan dibuka melalui pencarian [`time`](/id/2.0/ref/models/querysets/#std-fieldlookup-time).
- Ditambahkan dukungan untuk pernyataan dalam [`QuerySet.values()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.values) dan [`values_list()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.values_list).
- Ditambahkan dukungan untuk pernyataan permintaan yang mengambil banyak argumen, seperti `range`.
- Anda dapat sekarang menggunakan pilihan `unique=True` dengan [`FileField`](/id/2.0/ref/models/fields/#django.db.models.FileField).
- Ditambahkan parameter `nulls_first` dan `nulls_last` ke [`Expression.asc()`](/id/2.0/ref/models/expressions/#django.db.models.Expression.asc) dan [`desc()`](/id/2.0/ref/models/expressions/#django.db.models.Expression.desc) untuk mengendalikan urutan dari nilai-nilai null.
- Pernyataan `F` baru metode `bitleftshift()` dan `bitrightshift()` mengizinkan [bitwise shift operations](/id/2.0/topics/db/queries/#using-f-expressions-in-filters).
- Ditambahkan [`QuerySet.union()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.union), [`intersection()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.intersection), dan [`difference()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.difference).

#### Permintaan dan Tanggapan

- Ditambahkan [`QueryDict.fromkeys()`](/id/2.0/ref/request-response/#django.http.QueryDict.fromkeys).
- [`CommonMiddleware`](/id/2.0/ref/middleware/#django.middleware.common.CommonMiddleware) sekarang menyetel kepala tanggapan `Content-Length` untuk tanggapan bukan-aliran.
- Ditambahkan pengaturan [`SECURE_HSTS_PRELOAD`](/id/2.0/ref/settings/#std-setting-SECURE_HSTS_PRELOAD) untuk mengizinkan menambahkan petunjuk `preload` ke kepala `Strict-Transport-Security`.
- [`ConditionalGetMiddleware`](/id/2.0/ref/middleware/#django.middleware.http.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`](/id/2.0/topics/serialization/#django.core.serializers.json.DjangoJSONEncoder) sekarang menserialkan obyek [`timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta) (digunakan oleh [`DurationField`](/id/2.0/ref/models/fields/#django.db.models.DurationField)).

#### Templat

- [`mark_safe()`](/id/2.0/ref/utils/#django.utils.safestring.mark_safe) sekarang dapat digunakan sebagai penghias.
- Backend cetakan [`Jinja2`](/id/2.0/topics/templates/#django.template.backends.jinja2.Jinja2) sekarang mendukung pengolah konteks dengan mengatur pilihan `'context_processors'` dalam `OPTIONS 1`.
- Etiket [`regroup`](/id/2.0/ref/templates/builtins/#std-templatetag-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`](/id/2.0/ref/templates/builtins/#std-templatetag-resetcycle) untuk mengizinkan mengatur kembali urutan dari etiket cetakan [`cycle`](/id/2.0/ref/templates/builtins/#std-templatetag-cycle).
- Anda sekarang dapat menentukan direktori khusus untuk  [`filesystem.Loader`](/id/2.0/ref/templates/api/#django.template.loaders.filesystem.Loader) tertentu.

#### Pengujian

- Ditambahkan [`DiscoverRunner.get_test_runner_kwargs()`](/id/2.0/topics/testing/advanced/#django.test.runner.DiscoverRunner.get_test_runner_kwargs) untuk mengizinkan penyesuaian argumen katakunci dilewatkan ke penjalan percobaan.
- Ditambahkan pilihan [`test --debug-mode`](/id/2.0/ref/django-admin/#cmdoption-test-debug-mode) untuk membantu memecahkan masalah kegagalan percobaan dengan mengatur pengaturan [`DEBUG`](/id/2.0/ref/settings/#std-setting-DEBUG) menjadi `True`.
- [`django.test.utils.setup_databases()`](/id/2.0/topics/testing/advanced/#django.test.utils.setup_databases) baru (dipindah dari `django.test.runner`) dan fungsi [`teardown_databases()`](/id/2.0/topics/testing/advanced/#django.test.utils.teardown_databases) membuatnya lebih mudah membangun pejalan percobaan penyesuaian.
- Ditambahkan dukungan untuk [`unittest.TestCase.subTest()`](https://docs.python.org/3/library/unittest.html#unittest.TestCase.subTest) ketika menggunakan  pilihan [`test --parallel`](/id/2.0/ref/django-admin/#cmdoption-test-parallel).
- `DiscoverRunner` sekarang menjalankan pemeriksaan sistem pada awal dari penjalanan percobaan. Timpa metode [`DiscoverRunner.run_checks()`](/id/2.0/topics/testing/advanced/#django.test.runner.DiscoverRunner.run_checks) jika anda ingin meniadakan itu.

#### Pengesah

- Ditambahkan [`FileExtensionValidator`](/id/2.0/ref/validators/#django.core.validators.FileExtensionValidator) untuk mensahkan berkas tambahan dan [`validate_image_file_extension`](/id/2.0/ref/validators/#django.core.validators.validate_image_file_extension) untuk mensahkan berkas-berkas gambar.

## Perubahan ketidaksesuaian kebelakang dalam 1.11

### [`django.contrib.gis`](/id/2.0/ref/contrib/gis/#module-django.contrib.gis)

- Untuk memudahkan basiskode dan karena itu lebih mudah memasang daripada ketika `contrib.gis` terbitan pertama, [GDAL](/id/2.0/ref/contrib/gis/install/geolibs/#gdalbuild) 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](https://code.djangoproject.com/ticket/14284).
- 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`](/id/2.0/ref/forms/renderers/#django.forms.renderers.TemplatesSetting).

### [`django.contrib.staticfiles`](/id/2.0/ref/contrib/staticfiles/#module-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`](/id/2.0/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.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`](/id/2.0/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.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`](/id/2.0/ref/models/querysets/#std-fieldlookup-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`.
- Atribut `DatabaseFeatures.supports_index_column_ordering` baru menentukan jika sebuah basisdata mengizinkan menentukan urutan untuk kolom-kolom dalam indeks. Nilai awalan adalah `True` dan metode `DatabaseIntrospection.get_constraints()` harus menyertakan kunci `'orders'` dalam setiap dari kamus-kamus yang dikembalikan dengan daftar dari nilai-nilai `'ASC'` dan/atau `'DESC'` berhubungan ke urutan dari setiap kolom dalam indeks.
- [`inspectdb`](/id/2.0/ref/django-admin/#django-admin-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`](/id/2.0/topics/auth/#module-django.contrib.auth) dan `i18n`

`LoginView`, `LogoutView` (dan setara berdasarkan-fungsi diusangkan), dan [`set_language()`](/id/2.0/topics/i18n/translation/#django.views.i18n.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()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create) dan [`update_or_create()`](/id/2.0/ref/models/querysets/#django.db.models.query.QuerySet.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](https://pypi.org/project/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](https://groups.google.com/d/topic/django-developers/OAV3FChfuPM/discussion) 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`](/id/2.0/topics/i18n/formatting/#std-templatetag-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.

### Server-side cursors on PostgreSQL

The change to make [`QuerySet.iterator()`](/id/2.0/ref/models/querysets/#django.db.models.query.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`](/id/2.0/ref/settings/#std-setting-DATABASE-DISABLE_SERVER_SIDE_CURSORS) setting (added in Django 1.11.1) in
[`DATABASES`](/id/2.0/ref/settings/#std-setting-DATABASES).

Lihat [Transaction pooling and server-side cursors](/id/2.0/ref/databases/#transaction-pooling-server-side-cursors) untuk obrolan lebih.

### Bermacam-macam

- Jika tidak ada barang dalam umpan mempunyai atribut `pubdate` atau `updateddate`, [`SyndicationFeed.latest_post_date()`](/id/2.0/ref/utils/#django.utils.feedgenerator.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`](/id/2.0/ref/settings/#std-setting-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`](/id/2.0/ref/settings/#std-setting-ALLOWED_HOSTS). Lihat [Tests and multiple host names](/id/2.0/topics/testing/advanced/#topics-testing-advanced-multiple-hosts).
- 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`](/id/2.0/ref/models/fields/#django.db.models.CharField) dengan `null=True` sekarang menyimpan nilai `NULL` daripada string kosong.
- Pada Oracle, [`Model.validate_unique()`](/id/2.0/ref/models/instances/#django.db.models.Model.validate_unique) tidak lagi memeriksa string kosong untuk keunikan sebagai penafsir basisdata nilai sebagai `NULL`.
- Jika anda mensubkelaskan [`AbstractUser`](/id/2.0/topics/auth/customizing/#django.contrib.auth.models.AbstractUser) dan menimpa `clean()`, pastikan itu memanggil `super()`. [`BaseUserManager.normalize_email()`](/id/2.0/topics/auth/customizing/#django.contrib.auth.models.BaseUserManager.normalize_email) dipanggil dalam sebuah metode [`AbstractUser.clean()`](/id/2.0/topics/auth/customizing/#django.contrib.auth.models.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()`](/id/2.0/ref/models/relations/#django.db.models.fields.related.RelatedManager.add), [`remove()`](/id/2.0/ref/models/relations/#django.db.models.fields.related.RelatedManager.remove), [`clear()`](/id/2.0/ref/models/relations/#django.db.models.fields.related.RelatedManager.clear), dan [`set()`](/id/2.0/ref/models/relations/#django.db.models.fields.related.RelatedManager.set) sekarang membersihkan cache `prefetch_related()`.
- Untuk mencegah kemungkinan kehilangan dari pengaturan disimpan, [`setup_test_environment()`](/id/2.0/topics/testing/advanced/#django.test.utils.setup_test_environment) sekarang memunculkan sebuah pengecualian jika dipanggil satu detik sebelum memanggil [`teardown_test_environment()`](/id/2.0/topics/testing/advanced/#django.test.utils.teardown_test_environment).
- Nama lain `DateTimeAwareJSONEncoder` tidak terdokumentasi untuk [`DjangoJSONEncoder`](/id/2.0/topics/serialization/#django.core.serializers.json.DjangoJSONEncoder) (dinamai kembali dalam Django 1.0) dipindahkan.
- The [`cached template loader`](/id/2.0/ref/templates/api/#django.template.loaders.cached.Loader)
  is now enabled if [`OPTIONS['loaders']`](/id/2.0/ref/settings/#std-setting-TEMPLATES-OPTIONS) isn't
  specified and [`OPTIONS['debug']`](/id/2.0/ref/settings/#std-setting-TEMPLATES-OPTIONS) is `False`
  (the latter option defaults to the value of [`DEBUG`](/id/2.0/ref/settings/#std-setting-DEBUG)). This could
  be backwards-incompatible if you have some [template tags that aren't
  thread safe](/id/2.0/howto/custom-template-tags/#template-tag-thread-safety).
- Penunjukan untuk penghapusan jenis isi basi tidak lagi muncul setelah menjalankan perintah `migrate`. Gunakan perintah [`remove_stale_contenttypes`](/id/2.0/ref/django-admin/#django-admin-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**](https://datatracker.ietf.org/doc/html/rfc2616.html).
- [`patch_response_headers()`](/id/2.0/ref/utils/#django.utils.cache.patch_response_headers) tidak lagi menambah kepala `Last-Modified`. Menurut [**RFC 7234 Section 4.2.2**](https://datatracker.ietf.org/doc/html/rfc7234.html#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`](/id/2.0/ref/middleware/#django.middleware.cache.UpdateCacheMiddleware) dan [`add_never_cache_headers()`](/id/2.0/ref/utils/#django.utils.cache.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`](/id/2.0/ref/middleware/#django.middleware.http.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`](/id/2.0/ref/middleware/#django.middleware.common.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()`](/id/2.0/ref/applications/#django.apps.AppConfig.get_model) dan [`get_models()`](/id/2.0/ref/applications/#django.apps.AppConfig.get_models) sekarang memunculkan [`AppRegistryNotReady`](/id/2.0/ref/exceptions/#django.core.exceptions.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`](https://docs.python.org/3/library/io.html#io.StringIO) dan [`BytesIO`](https://docs.python.org/3/library/io.html#io.BytesIO)) diunggah pada sebuah [`ImageField`](/id/2.0/ref/models/fields/#django.db.models.ImageField) menggunakan klien percobaan sekarang membutuhkan sebuah atribut `name` dengan sebuah nilai yang melewatkan pengesah [`validate_image_file_extension`](/id/2.0/ref/validators/#django.core.validators.validate_image_file_extension). Lihat catatan dalam [`Client.post()`](/id/2.0/topics/testing/tools/#django.test.Client.post).
- [`FileField`](/id/2.0/ref/models/fields/#django.db.models.FileField) now moves rather than copies the file
  it receives. With the default file upload settings, files larger than
  [`FILE_UPLOAD_MAX_MEMORY_SIZE`](/id/2.0/ref/settings/#std-setting-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`](/id/2.0/ref/settings/#std-setting-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()`](/id/2.0/ref/urlresolvers/#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`](/id/2.0/topics/auth/default/#django.contrib.auth.views.LoginView) dan [`LogoutView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.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`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordChangeView), [`PasswordChangeDoneView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordChangeDoneView), [`PasswordResetView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordResetView), [`PasswordResetDoneView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordResetDoneView), [`PasswordResetConfirmView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordResetConfirmView), dan [`PasswordResetCompleteView`](/id/2.0/topics/auth/default/#django.contrib.auth.views.PasswordResetCompleteView).
- `django.test.runner.setup_databases()` dipindahkan ke [`django.test.utils.setup_databases()`](/id/2.0/topics/testing/advanced/#django.test.utils.setup_databases). Tempat lama diusangkan.
- `django.utils.translation.string_concat()` diusangkan mendukung [`django.utils.text.format_lazy()`](/id/2.0/ref/utils/#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()`](/id/2.0/topics/auth/default/#django.contrib.auth.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`](/id/2.0/ref/middleware/#django.middleware.http.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`](/id/2.0/ref/urls/#django.conf.urls.handler404) yang mencari karakter huruf besar dalam URL dan pengalihkan ke setara huruf kecil.
- Argumen `renderer` ditambahkan pada metode [`Widget.render()`](/id/2.0/ref/forms/widgets/#django.forms.Widget.render). Metode-metode yang tidak menerima bahwa argumen akan bekerja melalui masa pengusangan.
