# dokumentasi Django 2.2.9.dev20191202104323

# Catatan terbitan Django 1.8

April 1, 2015

Selamat datang di Django 1.8!

Catatan terbitan ini mencangkup new features, sama halnya beberapa backwards incompatible changes anda akan ingin waspadai ketika meningkatkan dari Django 1.7 atau versi terlama. Kami juga telah begun the deprecation process for some features, dan beberapa telah dicapai pada akhir pengolahan pengusangan mereka dan have been removed.

Lihat panduan Meningkatkan Django ke versi terbaru jika anda sedang memperbaharui proyek yang ada.

Django 1.8 telah dirancang sebagai long-term support release kedua Django. Itu akan menerima pembaharuan keamanan untuk setidaknya tiga tahun setelah terbitannya. Dukungang untuk LTS sebelumnya, Django 1.4 akan berakhir 6 bulan dari tanggal terbitan Django 1.8.

## Kesesuaian Python

Django 1.8 membutuhkan Python 2.7, 3.2, 3.3, 3.4 atau 3.5. Kami sangat menganjurkan dan hanya secara resmi mendukung terbitan terakhir dari setiap rangkaian.

Django 1.8 adalah terbitan pertama untuk mendukung Python 3.5.

Karena akhir dari dukungan hulu untuk Python 3,2 di Februari 2016, kami tidak akan mencoba Django 1.8.x di Python 3.2 setelah akhir dari 2016.

## Apa yang baru di Django 1.8

### API `Model._meta`

Django sekarang telah memerumuskan API untuk Model._meta, menyediakan sebuah cara dukungan resmi pada retrieve fields dan bidang penyaring berdasarkan pada attributes mereka.

The `Model._meta` object has been part of Django since the days of pre-0.96 "Magic Removal" -- it just wasn't an official, stable API. In recognition of this, we've endeavored to maintain backwards-compatibility with the old API endpoint where possible. However, API endpoints that aren't part of the new official API have been deprecated and will eventually be removed.

### Banyak cetakan mesin

Django 1.8 menentukan API stabil untuk menyatukan backend cetakan. Itu menyertakan dukungan siap-pakai untuk bahasa cetakan Django dan untuk `Jinja2`. Itu mendukung membangun cetakan dengan banyak mesin dalam proyek sama. Pelajari lebih tentang fitur baru di topic guide dan tingkatkan petunjuk-petunjuk dalam versi terlama dari dokumentasi.

### Peningkatan keamanan

Beberapa fitur-fitur dari pustaka pihak-ketiga django-secure telah dipadukan kedalam Django. `django.middleware.security.SecurityMiddleware` menyediakan beberapa peningkatan keamanan pada siklus request/response. Pilihan `check --deploy` baru mengizinkan anda untuk memeriksa berkas pengaturan produksi untuk cara meningkatkan keamanan dari situs anda.

### Kegunaan khusus PostgreSQL baru

Django sekarang mempunyai sebuah modul dengan perpanjangan untuk fitur-fitur khusus PostgreSQL , seperti pencarian `ArrayField`, `HStoreField`, Bidang Jangkauan, dan `unaccent`. Sebuah uraian penuh dari fitur tersedia in the documentation.

### Jenis data baru

- Django sekarang mempunyai `UUIDField` untuk menyimpan penciri unik universal. Itu disimpan sebagai jenis dara `uuid` asli di PostgreSQL dan sebagaibidang karakter panjang tetap di backend lain. Ada sebuah `form field` yang sesuai.
- Django sekarang mempunyai sebuah `DurationField` untuk menyimpan periode waktu - model di Python oleh `timedelta`. Itu disimpan dalam jenis data `interval` asli di PostgreSQL, sebagai sebuah `INTERVAL DAY(9) TO SECOND(6)` di Oracle, dan sebagai `bigint` dari mikrodetik di backend lain. Tanggal dan waktu terkait aritmatik juga telah ditingkatkan pada semua backend. Ada sebuah `form field` yang berhubungan.

### Query Expressions, Conditional Expressions, dan Database Function

Query Expressions mengizinkan anda membuat, menyesuaikan, dan menyusun pernyataan SQL rumit. Ini mempunyai keterangan diadakan untuk menerima pernyataan selaind ari pengumpulan. Pengumpulan sekarang dapat mengacu banyak bidang, sama halnya aritmatika, mirip pada obyek `F()`. `order_by()` juga mendapatkan kemampuan menerima pernyataan.

Conditional Expressions mengizinkan anda menggunakan logika `if` ... `elif` ... `else` dalam permintaan.

Sebuah kumpulan dari database functions juga disertakan dengan kegunaan seperti `Coalesce`, `Concat`, dan `Substr`.

### Pengaturan data `TestCase`

`TestCase` telah direfaktor untuk mengizinkan untuk inisialisasi data pada tingkatan kelas menggunakan transaksi dan titik simpan. Backend basisdata yang tidak mendukung transaksi, seperti MySQL dengan penyimpanan MyISAM, akan masih dapat menjalankan percobaan ini tetapi tidak akan bermanfaat dari perbaikan. Percobaan sekarang berjalan dalam dua blok `atomic()` bersarang: satu untuk keseluruhan kelas dan untuk setiap percobaan.

- Metode kelas `TestCase.setUpTestData()` menambah kemampuan untuk mengatur percobaan data pada tingkat kelas. Menggunakan teknik ini dapat mempercepat percobaan seperti dibandingkan untuk menggunakan `setUp()`.
- Fixture loading within `TestCase` is now performed once for the whole `TestCase`.

### Fitur kecil

#### `django.contrib.admin`

- `ModelAdmin` sekarang mempunyai sebuah metode `has_module_permission()` untuk mengizinkan membatasi akses pada modul di halaman indeks admin.
- `InlineModelAdmin` sekarang mempunyai sebuah atribut `show_change_link` yang mendukung menampilkan sebuah tautan ke berderet formulir rubah obyek.
- Gunakan `django.contrib.admin.RelatedOnlyFieldListFilter` baru di `ModelAdmin.list_filter` untuk membatasi pilihan `list_filter` pada obyek asing yang dilampirkan untuk mereka dari `ModelAdmin`.
- `ModelAdmin.delete_view()` menampilkan ringkasan dari obyek untuk dihapus pada jalaman penegasan penghapusan.
- Pustaka jQuery tertanam di admin telah ditingkatkan ke versi 1.11.2.
- Anda sekarang dapat menentukan `AdminSite.site_url` untuk menampilkan sebuah tautan ke situs front-end.+
- Anda sekarang dapat menentukan `ModelAdmin.show_full_result_count` untuk mengendalikan apakah atau tidak hitungan penuh obyek harus ditampilkan pada halaman admin tersaring.
- Metode `AdminSite.password_change()` sekarang mempunyai sebuah parameter `extra_context`.
- Anda sekarang dapat mengendalikan siapa yang dapat masuk ke situs admin dengan menimpa hanya `AdminSite.has_permission()` dan `AdminSite.login_form`. Cetakan `base.html` mempunyai blok baru `usertools` yang mengandung kepala khusus-pengguna. Sebuah variabel konteks baru `has_permission`, yang mendapatkan nilainya dari `has_permission()`, menandakan apakah pengguna dapat mengakses situs.
- Dropdown foreign key sekarang mempunyai tombol untuk merubah atau menghapus obyek terkait menggunakan sebuah popup.

#### `django.contrib.admindocs`

- reStructuredText sekarang diuraikan di model docstring.

#### `django.contrib.auth`

- Otorisasi backend sekarang dapat memunculkan `PermissionDenied` di `has_perm()` dan `has_module_perms()` pada pemeriksaan perizinan sirkit-pendek.
- `PasswordResetForm` sekarang mempunyai metode `send_mail()` yang dapat ditimpa untuk menyesuaikan surat untuk dikirim.
- `max_length` dari `Permission.name` telah ditingkatkan dari 50 menjadi 255 karakter. Harap jalankan perpindahan basisdata.
- `USERNAME_FIELD` dan `REQUIRED_FIELDS` sekarang mendukung `ForeignKey`
- Perhitungan putaran awal untuk pengacak sandi PBKDF2 telah ditingkatkan oleh 33%. Perubahan kesesuaian kebelakang tidak akan mempengaruhi pengguna yang telah disubkelaskan `django.contrib.auth.hashers.PBKDF2PasswordHasher` untuk merubah nilai awal.

#### `django.contrib.gis`

- GeoJSON serializer baru sekarang tersedia.
- Itu sekarang diizinkan untuk menyertakan sebuah sub permintaan sebagai argumen pencarian geografi, sebagai contoh `City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly'))`.
- Backend SpatiaLite sekarang mendukung pengumpulan `Collect` dan `Extent` ketika versi basisdata adalah 3.0 atay terakhir.
- Perintah inisialisasi PostGIS 2 `CREATE EXTENSION postgis` dan the SpatiaLite `SELECT InitSpatialMetaData` sekarang secara otomatis dijalankan oleh `migrate`.
- Antarmuka GDAL sekarang mendukung mengambil sifat dari raster (image) data file.
- Shim kesesuaian untuk `SpatialRefSys` dan `GeometryColumns` berubah di Django 1.2 telah dipindahkan.
- Semua pengecualian terkait-GDAL sekarang dimunculkan dengan `GDALException`. Pendahulu `OGRException` telah disimpan untuk kesesuaian kebelakang tetapi harus tidak digunakan lagi.

#### `django.contrib.sessions`

- Kue sesi sekarang dihapus setelah `flush()` dipanggil.

#### `django.contrib.sitemaps`

- Atribut `Sitemap.i18n` baru mengizinkan anda untuk membangkitkan sebuah peta situs berdasarkan pada pengaturan `LANGUAGES`.

#### `django.contrib.sites`

- `get_current_site()` akan sekarang mencari situs saat ini berdasarkan pada `request.get_host()` jika pengaturan `SITE_ID` tidak ditentukan.
- Awalan `Site` dibuat ketika menjalankan `migrate` sekarang menghormati pengaturan `SITE_ID` (sebagai gantinya dari selalu menggunakan `pk=1`).

#### Tembolok

- Metode `incr()` dari backend `django.core.cache.backends.locmem.LocMemCache` sekarang thread-safe.

#### Kriptografi

- Parameter `max_age` dari metode `django.core.signing.TimestampSigner.unsign()` sekarang juga menerima sebuah obyek `datetime.timedelta`.

#### Backend basisdata

- Backend MySQL tidak lagi melucuti mikrodetik dari nilai-nilai `datetime` sebagai MySQL 5.6.4 dan mendukung sampai pecahan detik tergantung pada pernyataan dari bidang datetime (ketika `DATETIME` menyertakan ketelitian pecahan lebih besar dari 0). Kolom basisdata datetime baru dibuat dengan Django 1.8 dan MySQL 5.6.4 dan sampai mendukung mikrodetik. Lihat MySQL database notes untuk rincian lebih.
- Backend MySQL tidak lagi dibuat membuat indeks jelas untuk foreign key ketika menggunakan mesin penyimpanan InnoDB. ketika MySQL sudah membuat mereka secara otomatis.
- Backend Oracle tidak lagi menentukan fitur `connection_persists_old_columns` sebagai `True`. Sebagai gantinya, Oracle akan sekarang menyertakan sebuah klausa penghilang cache ketika mendapatkan gambaran.

#### Surel

- Email backends sekarang mendukung protokol pengelola konteks untuk membuka dan menutup hubungan.
- Backend surel SMTP sekarang mendukung otentifikasi `keyfile` dan `certfile` dengan pengaturan `EMAIL_SSL_CERTFILE` dan `EMAIL_SSL_KEYFILE`.
- SMTP `EmailBackend` sekarang mendukung pengaturan parameter `timeout` dengan pengaturan `EMAIL_TIMEOUT`.
- `EmailMessage` dan `EmailMultiAlternatives` sekarang mendukung parameter `reply_to`.

#### Penyimpanan Berkas

- `Storage.get_available_name()` dan `Storage.save()` sekarang mengambil argumen `max_length` untuk menerapkan batasan panjang nama berkas maksimal tingkat-penyimpanan. Nama berkas melampaui argumen ini akan dipotong. Ini mencegah kesalahan basisdata ketika menambahkan sebuah akhiran unik pada sebuah nama berkas panjang yang sudah ada di penyimpanan. Lihat deprecation note tentang menambahkan argumen ini ke penyesuaian kelas penyimpanan anda.

#### Formulir

- Widget formulir sekarang membangun atribut dengan nilai dari `True` atau `False` sebagai atribut boolean HTML5.
- Metode `has_error()` barumengizinkan pemeriksaan jika kesalahan tertentu terjadi.
- Jika `required_css_class` ditentukan di sebuah formulir, kemudian etiket `<label>` untuk bidang wajib akan mempunyai kelas ini hadir di atributnya.
- Pembangunan dari kesalagan bukan-bidang dalam unordered lists (`<ul>`) sekarang menyertakan `nonfield` dalam daftarnya dari kelas-kelas untuk membedakan mereka dari kesalagan bidang-tertentu.
- `Field` sekarang menerima sebuah argumen `label_suffix`, yang akan menimpa `label_suffix` formulir. Ini mengadakan penyesuaian akhiran pada berdasarkan per bidang - sebelumnya itu tidak memungkinkan untuk mengesampingkan sebuah `label_suffix` formulir selagi menggunakan jalan pintas seperti `{{ form.as_p }}` di cetakan.
- `SelectDateWidget` sekarang menerima sebuah argumen `empty_label`, yang akan menimpa label pilihan daftar teratas ketika `DateField` tidak wajib.
- Setelah sebuah `ImageField` telah dibersihkan dan disahkan, obyek `UploadedFile` akan mempunyai sebuah tambahan atribut `image` mengandung instance `Image` Pillow digunakan untuk memeriksa jika berkas adalah nama sah. Itu juga akan memperbaharui `UploadedFile.content_type` dengan jenis isi gambar seperti yang ditentukan oleh Pillow.
- Anda dapat sekarang melewatkan callable yang mengembalikan sebuah perulangan dari pilihan ketika membuat obyek `ChoiceField`.

#### Tampilan Umum

- Tampilan umum yang menggunakan `MultipleObjectMixin` mungkin tidak menentukan urutan berlaku pada `queryset` dengan mengatur `ordering` atau menimpa `get_ordering()`.
- Atribut `SingleObjectMixin.query_pk_and_slug` baru mengizinkan merubah perilaku dari `get_object()` sehingga itu akan menampilkan pencariannya menggunakan kedua primary key dan keong.
- Metode `get_form()` tidak membutuhkan sebuah `form_class` untuk disediakan lagi. Jika tidak disediakan `form_class` awalan pada `get_form_class()`.
- Placeholders di `ModelFormMixin.success_url` sekarang mendukung sintaksis `str.format()` syntax. The legacy `%(<foo>)s` Python masih didukung tetapi akan dipindahkan di Django 1.10.

#### Internasionalisasi

- `FORMAT_MODULE_PATH` sekarang dapat berupa sebuah daftar dari string mewakili jalur-jalur modul. Ini mengizinkan mengimpor beberapa bentuk modul dari aplikasi dapat digunakan yang berbeda. Itu juga mengizinkan menimpa bentuk penyesuaian tersebut di proyek Django utama anda.

#### Pencatatan

- Kelas `django.utils.log.AdminEmailHandler` sekarang mempunyai sebuah metode `send_mail()` untuk membuatnya subkelas lebih ramah.

#### Pengelolaan perintah

- Hubungan basisdata sekarang selalu ditutup setelah perintah pengelolaan dipanggil dari baris perintah telah selesai melakukan pekerjaannya.
- Perintah-perintah dari bentuk paket cara lain seperti eggs sekarang juga ditemukan.
- Pilihan `dumpdata --output` baru mengizinkan menentukan sebuah berkas yang data diserialisasi ditulis.
- Pilihan `makemessages --exclude` dan `compilemessages --exclude` baru mengizinkan mengeluarkan lokal tertentu dari pengolahan.
- `compilemessages` sekarang mempunyai sebuah pilihan `--use-fuzzy` atau `-f` yang menyertakan terjemahan kabur kedalam berkas-berkas tersusun.
- Pilihan `loaddata --ignorenonexistent` sekarang mengabaikan data untuk model yang tidak lagi ada.
- `runserver` sekarang menggunakan thread daemon untuk memuat kembali lebih cepat.
- `inspectdb` sekarang mengeluarkan `Meta.unique_together`. Itu juga dapat menginterospeksi `AutoField` untuk basisdata MySQL dan PostgreSQL.
- Ketika memanggil perintah pengelolaan dengan pilihan menggunakan `call_command()`, nama pilihan dapat mencocokkan nama pilihan baris perintah (tanpa awalan tanda garis) atau nama variabel tujuan pilihan akhir, tetapi dalam kedua kasus, menghasilkan pilihan diterima oleh perintah sekarang selalu nama `dest` ditentukan dalam pengertian pilihan perintah (selama perintah menggunakan modul `argparse`).
- Perintah `dbshell` sekarang mendukung pilihan pengaturan wewenang sertifikat SSL MySQL (`--ssl-ca`).
- `makemigrations --name` baru mengizinkan memberikan perpindahan sebuah penyesuaian nama daribada satu yang dibangkitkan.
- Perintah `loaddata` sekarang mencegah memuat alat bantu berulang. Jika `FIXTURE_DIRS` mengandung ganda atau jalur direktori alat bantu awalan (`app_name/fixtures`), sebuah pengecualian dimunculkan.
- Pilihan baru `makemigrations --exit` mengizinkan keluar dengan sebuah kode kesalahan jika tidak ada perpindahan dibuat.
- Perintah `showmigrations` baru mengizinkan mendaftarkan semua perpindahan dan ketergantungan mereka dalam sebuah proyek.

#### Middleware

- Atribut `CommonMiddleware.response_redirect_class` mengizinkan anda menyesuaikan pengalihan yang diterbitan oleh middleware.
- Sebuah pesan pencari kesalahan akan dicatat pada pencatat `django.request` ketika middleware memunculkan sebuah pengecualian `MiddlewareNotUsed` di suasana `DEBUG`.

#### Perpindahan

- Operasi `RunSQL` sekarang dapat menangani parameter dilewatkan ke pernyataan SQL.
- Itu sekarang memungkinkan untuk berpindah (kebanyakan mungkin data migrations) untuk aplikasi tanpa model.
- Perpindahan sekarang dapat serialize model managers sebagai bagian dari keadaan model.
- Sebuah generic mechanism to handle the deprecation of model fields telah ditambahkan.
- Metode/atribut kelas `RunPython.noop()` dan `RunSQL.noop` telah ditambahkan untuk memudahkan dalam pembuatan operasi `RunPython` dan `RunSQL` yang dapat dibatalkan.
- Operasi perpindahan `RunPython` dan `RunSQL` sekarang memanggil metode `allow_migrate()` dari perute basisdata. Perute dapat menggunakan yang baru diperkenalkan argumen `app_label` dan `hints` untuk membuatkeputusan perutean. Untuk mengambil keuntungan dari fitur ini anda butuh memperbaharui ke tanda tangan `allow_migrate` baru, lihat deprecation section untuk rincian lebih.

#### Model

- Django sekarang mencatat paling 9000 permintaan di `connections.queries`, untuk mencegah penggunaan memori terlalu banyak di pengolahan berjalan-lama dalam suasana mencari kesalahan.
- Ada sekarang sebuah pilihan `Meta` model untuk menentukan sebuah `default related name` untuk semua bidang berhubungan dari sebuah model.
- Model pickling dan queryset lintas versi berbeda dari Django tidak secara resmi didukung (itu mungkin bekerja, tetapi tidak ada jaminan). Sebuah variabel tambahan yang menentukan versi Django saat ini sekarang ditambahkan ke keadaan pickel dari model dan queryset, dan Django memunculkan sebuah `RuntimeWarning` ketika obyek-obyek ini tidak di pickle dalam versi berbeda daripada satu yang mereka telah di pickle.
- Ditambahkan `Model.from_db()` dimana pengguna Django menggunakan kapanpun obyek-obyek dimuat menggunakan ORM. Metode ini mengizinkan menyesuaikan perilaku memuat model.
- `extra(select={...})` sekarang mengizinkan anda untuk meloloskan urutan `%s` harfiah menggunakan `%%s`.
- Custom Lookups sekarang dapat didaftarkan menggunakan pola penghias.
- Atribut `Transform.bilateral` baru mengizinkan membuat perubahan timbal balik. Terjemahan ini diberlakukan pada kedua `lhs` dan `rhs` ketika digunakan dalam pernyataan pencarian, menyediakan kesempatan untuk pencarian lebih mutakhir.
- Karakter khusus SQL (, %, _) sekarang diloloskan dengan benar ketika pencarian pola (sebagai contoh `contains`, `startswith`, dll.) digunakan dengan sebuah ungkapan `F()` sebagai sisi tangan-kanan. Di kasus-kasus tersebut, pelolosan dilakukan oleh basisdata, yang dapat membawa ke permintaan agak rumit melibatkan pemanggilan fungsi `REPLACE` bersarang.
- Anda sekarang dapat menyegarkan instance model dengan menggunakan `Model.refresh_from_db()`.
- Anda sekarang dapat mendapatkan setelan dari bidang-bidang yang ditunda untuk sebuah model menggunakan `Model.get_deferred_fields()`.
- Bidang model `default` ini sekarang digunakan ketika bidang primary key disetel menjadi `None`.

#### Sinyal

- Pengecualian dari tuple `(receiver, exception)` dikembalikan oleh `Signal.send_robust()` sekarang mempunyai melacak kembali dilampirkan sebagai atribut __traceback__`.
- Argumen `environ`, yang mengandung struktur lingkungan WSGI dari permintaan, telah ditambahkan ke sinyal `request_started`.
- Anda sekarang dapat mengimpor sinyal `setting_changed()` dari `django.core.signals` untuk menghindari memuat `django.test` di keadaan bukan-percobaan. Django tidak lagi melalukannya sendiri.

#### Kerangka Sistem Pemeriksaan

- `register` dapat sekarang digunakan sebagai sebuah fungsi.

#### Templat

- `urlize` sekarang mendukung tautan hanya-ranah yang menyertakan karakter setelah ranah tingkat-atas (sebagai contoh `djangoproject.com/` dan `djangoproject.com/download/`).
- `urlize` tidak memperlakukan tanda seruan pada akhir dari sebuah ranah atau string permintaannya sebagai bagian dari URL ( URL di sebagai contoh `'djangoproject.com!` adalah `djangoproject.com`)
- Ditambahkan sebuah kelas `locmem.Loader` yang memuat cetakan Django dari sebuah kamus Python.
- Etiket `now` sekarang dapat menyimpan keluarannya di variabel konteks dengan sintaksis biasa: `{% sekarang 'j n Y' sebagai varname %}`.

#### Permintaan dan Tanggapan

- `WSGIRequest` sekarang menghormati jalur dimulai dengan `//`.
- Metode `HttpRequest.build_absolute_uri()` sekarang menangani jalur dimulai dengan tepat `//`.
- Jika `DEBUG` adalah `True` dan sebuah permintaan memunculkan sebuah `SuspiciousOperation`, tanggapan akan dibangun dengan halaman kesalahan rinci.
- Argumen `query_string` dari `QueryDict` sekarang pilihan, awalan ke `None`, jadi `QueryDict` kosong sekarang dapat di instansiasikan dengan `QueryDict()` sebagai gantinya `QueryDict(None)` atau `QueryDict('')`.
- Atribut `GET` dan `POST` dari sebuah obyek `HttpRequest` sekarang `QueryDict` daripada kamus, dan atribut `FILES` sekarang sebuah `MultiValueDict`. Ini membawa kelas ini kedalam baris dengan dokumentasi dan dengan `WSGIRequest`.
- Atribut `HttpResponse.charset` telah ditambahkan
- `WSGIRequestHandler` sekarang mengikuti RFC dalam merubah URI menjadi IRI, menggunakan `uri_to_iri()`.
- Metode `HttpRequest.get_full_path()` sekarang meloloskan karakter tidak aman dari bagian jalur dari sebuah Uniform Resource Identifier (URI) dengan benar.
- `HttpResponse` sekarang menerapkan sedikit tambahan motode seperti `getvalue()` sehingga instance dapat digunakan sebagai obyek aliran.
- Metode `HttpResponse.setdefault()` baru mengizinkan mengatur sebuah kepala meskipun itu sudah disetel.
- Anda dapat menggunakan `FileResponse` baru pada berkas aliran.
- Penghias `condition()` untuk pengolahan tampilan bersyarat sekarang mendukung kepala `If-unmodified-since`.

#### Pengujian

- Metode `RequestFactory.trace()` dan `Client.trace()` diterapkan, mengizinkan anda membuat permintaan `TRACE` di percobaan anda.
- Argumen `count` telah ditambahkan ke `assertTemplateUsed()`. Ini mengizinkan anda untuk menegaskan bahwa sebuah cetakan telah membangun sejumlah kali tertentu.
- Penegasan `assertJSONNotEqual()` baru mengizinkan anda mencoba yang dua fragmen JSON tidak setara.
- Ditambahkan pilihan pada perintah `test` untuk mempertahankan basisdata percobaan (`--keepdb`), untuk menjalankan percobaan-percobaan kasus dalam urutan terbalik (`--reverse`), dan untuk mengadakan pencatatan SQL untuk kegagalan percobaan (`--debug-sql`).
- Ditambahkan atribut `resolver_match` pada mencoba tanggapan klien
- Ditambahkan beberapa pengaturan yang mengizinkan penyesuaian dari parameter tablespace percobaan untuk Oracle: `DATAFILE`, `DATAFILE_TMP`, `DATAFILE_MAXSIZE` dan `DATAFILE_TMP_MAXSIZE`.
- Penghias `override_settings()` sekarang dapat mempengaruhi rute master dalam `DATABASE_ROUTERS`.
- Ditambahkan dukungan klien percobaan untuk unggahberkas dengan obyek seperti-berkas.
- Sebuah cache berbagi sekarang digunakan ketika dicoba dengan sebuah basisdata di-memori SQLite ketika menggunakan Python 3.4+ dan SQLite 3.7.13+. Ini mengizinkan berbagi basisdata diantara thread.

#### Pengesah

- `URLValidator` sekarang mendukung alamat IPv6, ranah unicode, dan URL mengandung data otentifikasi.

## Perubahan bertentangan kebelakang di 1.8

Peringatan

Sebagai tambahan pada perubahan diuraikan dalam bagian ini, pastikan meninjau kembali deprecation plan untuk setiap fitur-fitur yang telah dipindahkan. Jika anda belum memperbaharui kode anda dalam linimasa pengusangan untuk fitur yang diberikan, perpindahannya mungkin muncul sebagai sebuah perubahan tidak sesuai kebelakang.

### Tindakan obyek terkait berjalan di sebuah transaksi.

Beberapa tindakan pada obyek terkait seperti `add()` atau penugasan langsung menjalankan banyak data merubah permintaan tanpa membungkus mereka di transaksi. Untuk mengurangi resiko dari kerusakan data, semua data merubah metode yang mempengaruhi banyak obyek terkait (yaitu `add()`, `remove()`, `clear()`, dan penugasan langsung) sekarang melakukan data mereka merubah permintaan dari dalam sebuah transaksi, disediakan transaksi dukungan basisdata anda.

Ini mempunyai satu efek samping ketidaksesuaian kebelakang, penangan sinyal dipicu dari metode ini sekarang dijalankan dalam transaksi metode dan apapun pengecualian di sebuah penangan sinyal akan mencegah seluruh operasi.

### Menugaskan obyek tidak tersimpan pada hubungan memunculkan sebuah kesalahan

Catatan

Untuk lebih mudah mengizinkan penggunaan dalam-memori dari model, perubahan ini telah dikembalikan di Django 1.8.4 dan diganti dengan pemeriksaan selama `model.save()`. Sebagai contoh:

    >>> book = Book.objects.create(name="Django")
    >>> book.author = Author(name="John")
    >>> book.save()
    Traceback (most recent call last):
    ...
    ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'.

Pemeriksaan mirip pada penugasan untuk membalikkan hubungan one-to-one telah dipindahkan di Django 1.8.5.

Menugaskan obyek tidak tersimpan pada sebuah `ForeignKey`, `GenericForeignKey`, dan `OneToOneField` sekarang memunculkan `ValueError`.

Sebelumnya, penugasan dari obyek tidak disimpan dapat secara diam diabaikan. Sebagai contoh:

    >>> book = Book.objects.create(name="Django")
    >>> book.author = Author(name="John")
    >>> book.author.save()
    >>> book.save()

    >>> Book.objects.get(name="Django")
    >>> book.author
    >>>

Sekarang, sebuah kesalahan akan muncul untuk mencegah kehilangan data:

    >>> book.author = Author(name="john")
    Traceback (most recent call last):
    ...
    ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.

Jika anda membutuhkan mengizinkan penugasan dari instance tidak disimpan (perilaku lama) dan tidak khawatir tentang kemungkinan kehilangan data (sebagai contoh anda tidak pernah menyimpan obyek-obyek ke basisdata), anda dapat meniadakan pemeriksaan ini dengan menggunakan atribut `ForeignKey.allow_unsaved_instance_assignment`. (Atribut ini telah dipindahkan di 1.8.4 ketika itu tidak lagi bersangkut paut.)

### Perintah pengelolaan yang hanya menerima argumen penempatan

Jika anda telah menulis sebuah penyesuaian perintah pengelolaan yang hanya menerima argumen penempatan dan anda tidak menentukan variabel perintah `args`, anda mungkin mendapatkan sebuah kesalahan seperti `Error: unrecognized arguments: ...`, ketika penguraian variabel sekarang berdasarkan pada `argparse` yang tidak secara langsung menerima argumen penempatan. Anda dapat membuat perintah kesesuaian kebelakang anda dengan cukup mengatur variabel kelas `args`. Bagaimanapun, jika anda tidak harus menhaga kesesuaian dengan versi Django terlama, itu adalah lebih baik menerapkan metode `add_arguments()` baru seperti digambarkan di Menulis perintah django-admin penyesuaian.

### Penyesuaian argumen perintah pengelolaan percobaan melalui pejalan percobaan

Metode untuk menambah penyesuaian argumen pada perintah pengelolaan test melalui pejalan percobaan telah berubah. Sebelumnya, anda dapat menyediakan sebuah variabel kelas option_list pada pejalan percobaan untuk menambah argumen lebih (à la `optparse`). Sekarang menerapkan perilaku lama, anda telah membuat sebuah metode kelas `add_arguments(cls, parser)` dan memanggil `parser.add_argument` untuk menambahkan setiap penyesuaian argumen, sebagai pengurai adalah sekarang sebuah instance `argparse.ArgumentParser`.

### Pemeriksaan model memastikan nama-nama kolom dibangkitkan-otomatis dalam batasan ditentukan oleh basisdata.

Nama bidang yang tidak lebih panjang dari panjang nama kolom didukung oleh sebuah basisdata dapat membuat masalah. Sebagai contoh, dengan MySQL anda akan mendapatkan sebuah pengecualian mencoba membuat kolom, dan dengan PostgreSQL nama kolom dipotong oleh basisdata (anda mungkin melihat sebuah peringatan di catatan PostgreSQL).

Sebuah pemeriksaan model telah diperkenalkan untuk memperingati lebih baik pengguna pada skenario ini sebelum pembuatan sebenarnya dari tabel-tabel basisdata.

Jika anda mempunyai sebuah model yang ada dimana pemeriksaan ini kelihatan positif salah, sebagai contoh di PostgreSQL dimana nama sudah sedang dipotong, cukup menggunakan `db_column` untuk menentukan nama yang sedang digunakan.

Pemeriksaan juga berlaku pada kolom dibangkitkan dalam sebuah model `ManyToManyField.through` yang tersirat. Jika anda berjalan kedalam sebuah masalah disana, gunakan `through` untuk membuat sebuah model yang jelas dan kemudian tentukan `db_column` di kolomnya sesuai kebutuhan.

### Pencarian hubungan permintaan sekarang memeriksa jenis-jenis obyek

Meminta untuk pencarian model sekarang diperiksa jika obyek diloloskan adalah jenis benar dan memunculkan sebuah `ValueError` jika tidak. Sebelumnya, Django tidak peduli jika objek adalah jenis benar; itu cukup menggunakan atribut bidang terkait objek (sebagai contoh `id`) untuk pencarian. Sekarang, sebuah kesalahan dimunculkan untuk mencegah pencarian tidak benar:

    >>> book = Book.objects.create(name="Django")
    >>> book = Book.objects.filter(author=book)
    Traceback (most recent call last):
    ...
    ValueError: Cannot query "<Book: Django>": Must be "Author" instance.

### `select_related()` sekarang memeriksa bidang yang diberikan

`select_related()` sekarang mengesahkan bahwa bidang yang diberikan sebenarnya ada. Sebelumnya, bidang tidak ada secara diam diabaikan. Sekarang, sebuah kesalahan dimunculkan:

    >>> book = Book.objects.select_related('nonexistent_field')
    Traceback (most recent call last):
    ...
    FieldError: Invalid field name(s) given in select_related: 'nonexistent_field'

Pengesahan juga memastikan bahwa bidang yang diberikan adalah terhubung:

    >>> book = Book.objects.select_related('name')
    Traceback (most recent call last):
    ...
    FieldError: Non-relational field given in select_related: 'name'

### `EmailField.max_length` awal ditingkatkan menjadi 254

Karakter 75 awalan lama `max_length` tidak dapat menyimpan semua kemungkinan alamat surel RFC3696/5321-compliant. Untuk menyimpan semua kemungkinan alamat surel sah, `max_length` telah ditingkatkan menjadi 254 karakter. Anda akan butuh membangkitkan dan memberlakukan perpindahan basisdata untuk model yang anda terpengaruh (atau tambah `max_length=75` jika anda berharap menjaga panjang di bidang-bidang anda saat ini). Sebuah perpindahan untuk `django.contrib.auth.models.User.email` disertakan.

### Mendukung untuk PostgreSQL versi lebih lama dari 9.0

Akhir dari masa dukungan hulu telah sampai di Juli 2014 untuk PostgreSQL 8.4. Sebagai konsekuensinya, Django 1.8 menyetel 9.0 sebagai versi PostgreSQL minimal dia secara resmi dukung.

Ini juga menyertakan penjatuhan dukungan untuk PostGIS 1.3 and 1.4 ketika versi ini tidak didukung pada versi PostgreSQL terakhir daripada 8.4.

Django juga sekarang membutuhkan menggunakan Psycopg2 versi 2.4.5 atau lebih tinggi (atau 2.5+ jika anda ingin menggunakan `django.contrib.postgres`).

### Mendukung untuk MySQL versi lebih lama dari 5.5

Akhir dari masa dukungan hulu telah sampai di Januari 2012 untuk MySQL 5.0 dan Desember 2013 untuk MySQL 5.1. Sebagai konsekuensinya, Django 1.8 menyetel 5.5 sebagai versi MySQL minimal dia secara resmi dukung.

### Mendukung untuk Oracle versi lebih lama dari 11.1

Akhir dari masa dukungan hulu telah sampai di Juli 2010 untuk Oracle 9.2, Januari 2012 untuk Oracle 10.1, dan Juli 2013 untuk Oracle 10.2. Sebagai konsekuensinya, Django 1.8 menyetel 11.1 sebagai versi Oracle minimal dia secara resmi dukung.

### Hak khusus digunakan daripada peran untuk percobaan di Oracle

Versi awal dari Django memberikan peran CONNECT dan RESOURCE pada pengguna percobaan di Oracle. Peran-peran ini telah diusangkan, jadi Django 1.8 menggunakan hak pokok khusus. Perubahan dari hak memwajibkan pengguna utama untuk menjalankan percobaan (meskipun proyek dikonfigurasikan untuk menghindari membuat sebuah pengguna percobaan). Hak tepat mewajibkan sekarang dirinci dalam Oracle notes.

### `AbstractUser.last_login` selalu bernilai null

Bidang `AbstractUser.last_login` sekarang mengizinkan nilai null. Sebelumnya, itu diawalkan pada waktu ketika pengguna membuat yang menyesatkan jika pengguna tidak pernah masuk. Jika anda sedang menggunakan pengguna awalan (`django.contrib.auth.models.User`), jalankan perpindahan basisdata disertakan di `contrib.auth`.

Jika anda sedang menggunakan penyesuaian model pengguna yang mewarisi dari `AbstractUser`, anda akan butuh menjalankan `makemigrations` dan membangkitkan sebuah perpindahan untuk aplikasi anda yang mengandung model itu. Juga, jika berharap menyetel `last_login` menjadi `NULL` untuk pengguna yang belum masuk, anda dapat menjalankan permintaan ini:

    from django.db import models
    from django.contrib.auth import get_user_model
    from django.contrib.auth.models import AbstractBaseUser

    UserModel = get_user_model()
    if issubclass(UserModel, AbstractBaseUser):
        UserModel._default_manager.filter(
            last_login=models.F('date_joined')
        ).update(last_login=None)

### `django.contrib.gis`

- Dukungan untuk GEOS 3.1 dan GDAL 1.6 telah dibuang.
- Dukungan untuk SpatiaLite < 2.4 telah dibuang.
- Pencarian khusus-GIS telah direfaktorisasi untuk menggunakan API `django.db.models.Lookup`.
- Objek `str` representation of `GEOSGeometry` awalan telah berubah dari bentuk WKT menjadi EWKT (termasuk SRID). Ketika perwakilan ini digunakan dalam kerangka kerja serialisasi, itu berarti bahwa keluaran `dumpdata` akan sekarang mengandung nilai SRID dari obyek geometri.

### Prioritas dari pengolah konteks untuk `TemplateResponse` membawa sebaris dengan `render`

Pembangun `TemplateResponse` dirancang menjadi pengganti singgah untuk fungsi `render()`. Bagaimanapun, itu mempunyai sedikit ketidaksesuaian, bahwa untuk `TemplateResponse`, data konteks dari melewatkan di kamus konteks dapat dibayangi oleh data konteks dikembalikan dari pengolah konteks, sedangkan untuk `render` itu adalah cara lain. Ini adalah sebuah kesalahan, dan perilaku dari `render` lebih sesuai, sejak itu mengizinkan secara global menentukan pengolah konteks untuk menjadi dikesampingkan secara lokal di tampilan. Jika anda mengandalkan pada kenyataan data konteks di `TemplateResponse` dapat dikesampingkan menggunakan pengolah konteks, anda akan butuh merubah kode anda.

### Menimpa `setUpClass` / `tearDownClass` di kasus-kasus percobaan

Penghias `override_settings()` dan `modify_settings()` sekarang bertindak pada tingkat kelas ketika digunakan sebagai penghias kelas. Sebagai konsekuensi, ketika menimpa `setUpClass()` atau `tearDownClass()`, penerapan `super` harus selalu dipanggil.

### Pemindahan `django.contrib.formtools`

Aplikasi bantuan formtool telah dipindahkan untuk memisahkan paket dan halaman dokumentasi yang bersangkut-paut telah diperbaharui atau dipindahkan.

Paket baru tersedia di GitHub dan di PyPI.

### Memuat kembali hubungan basisdata diantara percobaan

Django sebelumnya menutup hubungan basisdata diantara setiap percobaan dalam sebuah `TestCase`. Ini tidak lagi kasus sebagai Django sekarang membungkus keseluruhan `TestCase` dalam sebuah transaksi. Jika beberapa percobaan anda bergantung pada perilaku lama, anda harus memiliki mereka mewarisi dari `TransactionTestCase` sebagai gantinya.

### Membersihkan namescpace `django.template`

Jika anda telah mengandalkan pada API pribadi diungkap dalam modul `django.template`, anda mungkin harus mengimpor mereka dari `django.template.base` sebagai gantinya.

Juga pribadi API `django.template.base.compile_string()`, `django.template.loader.find_template()`, dan `django.template.loader.get_template_from_string()` dipindahkan.

### Atribut `model` pada hubungan model pribadi

Di versi paling awal dari Django, pada model dengan hubungan lintas foreign key (sebagai contoh), `model._meta.get_all_related_objects()` mengembalikan hubungan sebagai sebuah `django.db.models.related.RelatedObject` dengan atribut `model` disetel ke sumber dari hubungan. Sekarang, metode ini mengembalikan hubungan sebagai `django.db.models.fields.related.ManyToOneRel` (API pribadi `RelatedObject` telah dipindahkan), dan atribut `model` distel ke sasaran dari hubungan daripada sumber. Sumber model adalah dapat diakses pada atribut `related_model` sebagai gantinya.

Pertimbangkan contoh ini dari tutorial di Django 1.8:

    >>> p = Poll.objects.get(pk=1)
    >>> p._meta.get_all_related_objects()
    [<ManyToOneRel: polls.choice>]
    >>> p._meta.get_all_related_objects()[0].model
    <class 'polls.models.Poll'>
    >>> p._meta.get_all_related_objects()[0].related_model
    <class 'polls.models.Choice'>

dan bandingkan dia pada perilaku versi lama:

    >>> p._meta.get_all_related_objects()
    [<RelatedObject: polls:choice related to poll>]
    >>> p._meta.get_all_related_objects()[0].model
    <class 'polls.models.Choice'>

Untuk mengakses model sumber, anda dapat menggunakan pola seperti ini untuk menulis kode yang akan bekerja dengan kedua Django 1.8 dan versi terlama:

    for relation in opts.get_all_related_objects():
        to_model = getattr(relation, 'related_model', relation.model)

Also note that `get_all_related_objects()` is deprecated in 1.8.

### API backend basisdata

Perubahan berikut pada API backend basisdata didokumentasikan untuk memandu penulisan backend pihak-ketiga tersebut dalam memperbaharui kode mereka.

- Kelas-kelas `BaseDatabaseXXX` telah dipindahkan ke `django.db.backends.base`. Harap mengimpor mereka dari tempat baru:

      from django.db.backends.base.base import BaseDatabaseWrapper
      from django.db.backends.base.client import BaseDatabaseClient
      from django.db.backends.base.creation import BaseDatabaseCreation
      from django.db.backends.base.features import BaseDatabaseFeatures
      from django.db.backends.base.introspection import BaseDatabaseIntrospection
      from django.db.backends.base.introspection import FieldInfo, TableInfo
      from django.db.backends.base.operations import BaseDatabaseOperations
      from django.db.backends.base.schema import BaseDatabaseSchemaEditor
      from django.db.backends.base.validation import BaseDatabaseValidation

- Atribut `data_types`, `data_types_suffix`, dan `data_type_check_constraints` telah dipindahkan dari kelas `DatabaseCreation` ke `DatabaseWrapper`.

- Metode `SQLCompiler.as_sql()` sekarang mengambil sebuah parameter `subquery` (#24164).

- Metode `BaseDatabaseOperations.date_interval_sql()` sekarang hanya mengambil parameter `timedelta`.

### `django.contrib.admin`

- `AdminSite` tidak lagi mengambil sebuah argumen `app_name` dan atribut `app_name` nya telah dipindahkan. Nama Aplikasi selalu `admin` (sebagai lawan pada nama instance yang anda dapat masih sesuaikan menggunakan `AdminSite(name="...")`.
- Metode `ModelAdmin.get_object()` (API pribadi) sekarang mengambil argumen ketiga bernama `from_field` untuk menentukan bidang mana harus cocok dengan `object_id` yang disediakan.
- Metode `ModelAdmin.response_delete()` sekarang mengambil argumen kedua bernama `obj_id` yang merupakan penciri serialisasi digunakan untuk mengambil obyek sebelum penghapusan.

### Pelolosan otomatis awalan dari fungsi di `django.template.defaultfilters`

Untuk membuat penyaring siap-pakai yang mengeluarkan HTML "safe by default" ketika memanggil mereka di kode Python, fungsi berikut di `django.template.defaultfilters` telah berubah menjadi pelolosan otomatis nilai masukan mereka:

- `join`
- `linebreaksbr`
- `linebreaks_filter`
- `linenumbers`
- `unordered_list`
- `urlize`
- `urlizetrunc`

Anda dapat kembali ke perilaku lama dengan menentukan `autoescape=False` jika anda sedang melewatkan isi yang dipercaya. Perubahan ini tidak mempunyai pengaruh apapun ketika menggunakan penyaring sesuai di cetakan.

### Bermacam-macam

- `connections.queries` adalah sekarang sebuah atribut hanya-baca.

- Hubungan basisdata dipertimbangkan sama hanya jika mereka obyek yang sama. Mereka tidak dapat diacak lagi.

- `GZipMiddleware` digunakan untuk meniadakan pemampatan untuk beberapa jenis isi ketika permintaan dari Internet Explorer, agar memecahkan sebuah kesalahan di IE6 dan paling awal. Perilaku ini dapat mempengaruhi penampilan pada IE7 dan terakhir. Itu telah dipindahkan.

- URLField.to_python` tidak lagi menambah sebuah buntutuan garis miring pada URL tidak berjalur.

- Penyaring cetakan `length` sekarang mengembalikan `0` untuk sebuah variabel tidak ditentukan, daripada sebuah string kosong.

- `ForeignKey.default_error_message['invalid']` telah berubah dari `'%(model)s instance with pk %(pk)r does not exist.'` menjadi `'%(model)s instance with %(field)s %(value)r does not exist.'` Jika anda menggunakan pesan ini di kode anda sendiri, harap memperbaharui daftar dari parameter yang disisipkan. Secara internal, Django akan melanjutkan menyediakan parameter `pk` di `params` untuk kesesuaian kebelakang.

- `UserCreationForm.error_messages['duplicate_username']` is no longer used. If you wish to customize that error message, override it on the form using the `'unique'` key in `Meta.error_messages['username']` or, if you have a custom form field for `'username'`, using the `'unique'` key in its `error_messages` argument.

- Blok `usertools` di cetakan `base.html` dari `django.contrib.admin` sekarang membutuhkan variabel konteks `has_permission` untuk disetel. Jika anda mempunyai tampilan admin penyesuaian apapun yang menggunakan cetakan ini, perbaharui mereka untuk melewatkan `AdminSite.has_permission()` ketika nilai variabel ini atau cukup menyertakan `AdminSite.each_context(request)` di konteks.

- Perubahan internal dibuat pada widget `ClearableFileInput` untuk mengizinkan penyesuaian lebih. Atribut `url_markup_template` tidak terdokumentasi telah dipindahkan dalam mendukung `template_with_initial`.

- Untuk ketetapan dengan penjaja utama lain, lokal `en_GB` sekarang mempunyai Sennin sebagai hari pertama dari minggu.

- Kedua telah dipindahkan dari lokal apapun yang memiliki mereka di `TIME_FORMAT`, `DATETIME_FORMAT`, atau `SHORT_DATETIME_FORMAT`.

- Ukuran maksimal awalan dari tablespace percobaan Oracle telah ditingkatkan dari 300 M (atau 200M, sebelum 1.7.2) menjadi 500M.

- `reverse()` and `reverse_lazy()` now return Unicode strings instead of bytestrings.

- Shim `CacheClass` telah dipindahkan dari semua backend cache. Nama lain ini disediakan untuk kesesuaian kebelakang dengan Django 1.3. Jika anda masih menggunakan mereka, harap perbaharui proyek anda untuk menggunakan nama kelas sebenarnya ditemukan di kunci `BACKEND` dari pengaturan `CACHES`.

- Secara awalan, `call_command()` sekarang selalu melewati pemeriksaan kerangka kerja (meskipun anda melewatkan itu `skip_checks=False`).

- Ketika mengulang terhadap baris, `File` sekarang menggunakan universal newlines. Berikut dikenali sebagai akhiran sebuah baris: kebiasaan akhir-baris Unix `'\n'`, kebiasaan Windows `'\r\n'`, dan kebiasaan Macintosh lama `'\r'`.

- Backend cache memcache `MemcachedCache` dan `PyLibMCCache` akan menghapus sebuah kunci jika `set()` gagal. Ini diperlukan untuk memastikan penyimpanan sesi `cache_db` selalu mengambil data sesi paling saat ini.

- API pribadi `override_template_loaders` dan `override_with_test_loader` di `django.test.utils` telah dipindahkan. Menimpa `TEMPLATES` dengan `override_settings` sebagai gantinya.

- Peringatan dari backend basisdata MySQL tidak lagi dirubah ke pengecualian ketika `DEBUG` adalah `True`.

- `HttpRequest` sekarang telah disederhanakan `repr` (sebagai contoh `<WSGIRequest: GET '/somepath/'>`). Ini tidak akan merubah perilaku dari kelas `SafeExceptionReporterFilter`.

- Tampilan berdasarkan-kelas yang menggunakan `ModelFormMixin` akan memunculkan sebuah pengecualian `ImproperlyConfigured` ketika kedua atribut `fields` dan `form_class` ditentukan. Sebelumnya, `fields` secara diam diabaikan.

- Ketika mengikuti pengalihan, klien percobaan sekarang memunculkan `RedirectCycleError` jika itu mengetahui perulangan atau menegai batasan pengalihan maksimal (daripada kemudian melewatkan secara diam).

- Deretan karakter dapat diartikan sebagai parameter `default` dari bidang adalah dimasukkan ke deretan karakter berwujud terakhir, jadi jenis kembalian dari `Field.get_default()` berbeda di beberapa kasus. Tidak ada perubahan pada nilai awalan yang merupakan hasil dari callable.

- `GenericIPAddressField.empty_strings_allowed` sekarang `False`. Backend basisdata yang mengartikan string kosong sebagai null (hanya Oracle diantara backend yang Django sertakan) akan tidak lagi merubah nilai null kembali ke string kosong. Ini adalah ketetapan dengan backend lain.

- When the `BaseCommand.leave_locale_alone` attribute is `False`, translations are now deactivated instead of forcing the "en-us" locale. In the case your models contained non-English strings and you counted on English translations to be activated in management commands, this will not happen any longer. It might be that new database migrations are generated (once) after migrating to 1.8.

- `django.utils.translation.get_language()` sekarang mengembalikan `None` daripada `LANGUAGE_CODE` ketika terjemahan secara sementara dinonaktifkan.

- Ketika sebuah terjemahan tidak ada untuk harfiah tertentu, fallback sekarang diambil dari bahasa `LANGUAGE_CODE` (daripada dari pesan `msid` tidak diterjemahkan).

- Bidang `name` dari `django.contrib.contenttypes.models.ContentType` telah dipindahkan dengan perpindahan dan diganti oleh sebuah sifat. Itu berarti itu tidak memungkinkan untuk meminta atau menyaring sebuah `ContentType` dengan bidang ini lagi.

  Hati-hati jika anda meningkatkan ke Django 1.8 dan melewati Django 1.7. Jika anda menjalankan `manage.py migrate --fake`, perpindahan ini akan dilewatkan dan anda akan melihat sebuah pengecualian `RuntimeError: Error creating new content types.` karena kolom `name` tidak akan dibuang dari basisdata. Gunakan `manage.py migrate --fake-initial` untuk meniru hanya perpindahan awalan sebagai gantinya.

- Pilihan `migrate --fake-initial` baru mengizinkan perpindahan inisial tiruan, Di 1.7, inisial perpindahan selalu secara otomatis tiruan jika semua tabel dibuat di inisial perpindahan sudah ada.

- Sebuah aplikasi tanpa perpindahan dengan `ForeignKey` pada sebuah aplikasi dengan perpindahan mungkin sekarang hasil di kesalahanbatasan foreign key ketika memindahkan basisdata atau menjalankan percobaan. Di Django 1.7, ini dapat gagal secara diam dan kembali di batasan hilang. Untuk mengatasi kesalahan, tambah perpindahan pada aplikasi tanpa mereka.

## Fitur diusangkan di 1.8

### Metode terpilih di `django.db.models.options.Options`

Sebagai bagian dari perumusan dari API `Model._meta` (dari kelas `django.db.models.options.Options`), sejumlah metode telah diusangkan dan akan dipindahkan di Django 1.10:

- `get_all_field_names()`
- `get_all_related_objects()`
- `get_all_related_objects_with_model()`
- `get_all_related_many_to_many_objects()`
- `get_all_related_m2m_objects_with_model()`
- `get_concrete_fields_with_model()`
- `get_field_by_name()`
- `get_fields_with_model()`
- `get_m2m_with_model()`

### Memuat etiket cetakan `cycle` dan `firstof` dari pustaka `future`

Django 1.6 memperkenalkan sintaksis `{% load cycle from future %}` dan `{% load firstof from future %}` untuk kesesuaian kedepan dari etiket cetakan `cycle` dan `firstof`. Sintaksis ini sekarang diusangkan dan akan dipindahkan di Django 1.10. Anda dapat cukup memindahkan etiket `{% load ... from future %}`.

### `django.conf.urls.patterns()`

Di haru dahulu dari Django, itu didorong untuk mengacukan tampilan sebagai string di `urlpatterns`:

    urlpatterns = patterns('',
        url('^$', 'myapp.views.myview'),
    )

dan Django secara ajaib akan mengimpor `myapp.views.myview` secara internal dan merubah string kedalam acuan fungsi sebenarnya. Untuk mengurangi perulangan ketika mengacu banyak tampilan dari modul yang sama, fungsi `patterns()` mengambil argumen `prefix` awal yang diwajibkan yang ditambahkan ke semua tampilan-sebagai-string di kumpulan dari `urlpatterns` itu:

    urlpatterns = patterns('myapp.views',
        url('^$', 'myview'),
        url('^other/$', 'otherview'),
    )

Di era modern, kami telah memperbaharui tutorial daripada menganjurkan modul tampilan anda dan mengacu fungsi tampilan anda (atau kelas-kelas) secara langsung. Ini mempunyai sejumlah keuntungan, semua berasal dari kenyataan bahwa kami sedang menggunakan Python biasa dalam menempatkan "Django String Magic": kesalahan-kesalahan ketika anda salah ketik sebuah nama tampilan adalah sedikit mengaburkan, IDE dapat membantu dengan pelengkapan otomatis dari nama-nama tampilan, dll.

Jadi hari ini, yang diatas menggunakan argumen `prefix` jauh lebih mungkin untuk ditulis (dan lebih baik ditulis) sebagai:

    from myapp import views

    urlpatterns = patterns('',
        url('^$', views.myview),
        url('^other/$', views.otherview),
    )

Dengan demikian `patterns()` melayani sedikit tujuan dan adalah sebuah tanggunan ketika mengajarkan pengguna baru (menjawab pertanyaan baru "mengapa Saya butuh string kosong ini sebagai argumen pertama pada `patterns()`?"). Untuk alasan ini, kami sedang mengusangkan itu. Memperbaharui kode anda adalah semudah memastikan bahwa `urlpatterns` adalah sebuah daftar dari instance `django.conf.urls.url()`. Sebagai contoh:

    from django.conf.urls import url
    from myapp import views

    urlpatterns = [
        url('^$', views.myview),
        url('^other/$', views.otherview),
    ]

### Melewatkan sebuah string sebagai `view` pada `url()`

Terkait pada barang sebelumnya, mengacu tampilan sebagai sting di fungsi `url()` adalah diusangkan. Lewatkan tampilan dapat dipanggil seperti digambarkan di bagian sebelumnya sebagai gantinya.

### Pengaturan terkait-cetakan

Sebagai sebuah konsekuensi dari banyak refaktor mesin cetakan, beberapa pengaturan diusangkan dalam mendukung `TEMPLATES`:

- `ALLOWED_INCLUDE_ROOTS`
- `TEMPLATE_CONTEXT_PROCESSORS`
- `TEMPLATE_DEBUG`
- `TEMPLATE_DIRS`
- `TEMPLATE_LOADERS`
- `TEMPLATE_STRING_IF_INVALID`

### `django.core.context_processors`

Pengolah konteks cetakan siap-pakai telah dipindahkan ke `django.template.context_processors`.

### `django.test.SimpleTestCase.urls`

Atribut `SimpleTestCase.urls` untuk menentukan konfigurasi URLConf dalam percobaan telah diusangkan dan akan dipindahkan di Django 1.10. Gunakan `@override_settings(ROOT_URLCONF=...)` sebagai gantinya.

### Argumen `prefix` pada `i18n_patterns()`

Terkait pada barang sebelumnya, argumen `prefix` pada `django.conf.urls.i18n.i18n_patterns()` telah diusangkan. Cukup melewatkan sebuah daftar dai instance `django.conf.urls.url()` sebagai gantinya.

### Menggunakan hitungan tidak benar dari nilai dibongkar di etiket cetakan `for`

Menggunakan sebuah hitungan tidak benar dari nilai dibongkar dalam etiket `for` akan memunculkan sebuah pengecualian daripada gagal secara diam di Django 1.10.

### Melewatkan jalur bertitik ke `reverse()` dan `url`

Membalikkan URL dengan jalur Python adalah sebuah tindakan yang mahal karena itu menyebabkan jalur menjadi berbalik untuk diimpor. Perilaku ini juga dihasilkan di security issue. Gunakan named URL patterns untuk membalikkan sebagai gantinya.

Jika anda sedang menggunakan `django.contrib.sitemaps`, tambah argumen `name` ke `url` yang mengacu `django.contrib.sitemaps.views.sitemap()`:

    from django.contrib.sitemaps.views import sitemap

    url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
        name='django.contrib.sitemaps.views.sitemap')

untuk memastikan kesesuaian ketika membalikkan oleh jalur Python dipindahkan di Django 1.10.

Serupa untuk peta situs GIS, tambah `name='django.contrib.gis.sitemaps.views.kml'` atau `name='django.contrib.gis.sitemaps.views.kmz'`.

Jika anda sedang menggunakan jalur Python untuk pengaturan `LOGIN_URL` atau `LOGIN_REDIRECT_URL`, gunakan nama dari `url()` sebagai gantinya.

### Metode dan modul pengumpulan

Modul `django.db.models.sql.aggregates` dan `django.contrib.gis.db.models.sql.aggregates` (kedua API pribadi), telah diusangkan sebagai `django.db.models.aggregates` dan `django.contrib.gis.db.models.aggregates` sekarang juga bertanggungjawab untuk pembangkitan SQL. Modul lama akan dipindahkan di Django 1.10.

Jika anda sedang menggunakan modul lama, lihat Query Expressions untuk petunjuk pada penulisan kembali pengumpulan penyesuaian menggunakan API stabil baru.

Metode berikut dan sifat dari `django.db.models.sql.query.Query` juga telah diusangkan dan shim kesesuaian kebelakang akan dipindahkan di Django 1.10:

- `Query.aggregates`, diganti oleh `annotations`.
- Query.aggregate_select`, diganti oleh `annotation_select`.
- `Query.add_aggregate()`, diganti oleh `add_annotation()`.
- `Query.set_aggregate_mask()`, diganti oleh `set_annotation_mask()`.
- `Query.append_aggregate_mask()`, diganti oleh `append_annotation_mask()`.

### Memperpanjang argumen perintah pengelolaan melalui `Command.option_list`

Perintah pengelolaan sekarang menggunakan `argparse` sebagai gantinya `optparse` untuk mengurai argumen baris-perintah dilewatkan ke perintah. Ini juga berarti bahwa cara untuk menambah argumen penyesuaian pada perintah telah berubah: daripada memperpanjang daftar kelas `option_list`, anda sekarang harus menimpa metode `add_arguments()` dan menambah argumen melalui `argparse.add_argument()`. Lihat this example untuk lebih rinci.

### `django.core.management.NoArgsCommand`

Kelas `NoArgsCommand` sekarang diusangkan dan akan dipindahkan di Django 1.10. Gunakan `BaseCommand` sebagai gantinya, yang mengambil tidak ada argumen secara awal.

### Mendaftarkan semua perpindahan di sebuah proyek

Pilihan `--list` dari perintah pengelolaan `migrate` telah diusangkan dan akan dipindahkan di Django 1.10. Gunakan `showmigrations` sebagai gantinya.

### Pilihan `cache_choices` dari `ModelChoiceField` dan `ModelMultipleChoiceField`

`ModelChoiceField` dan `ModelMultipleChoiceField` mengambil sebuah tidak terdokumentasi, `cache_choices` pilihan tidak dicoba. Ini menyimpan queryset diantara pembangunan banyak dari obyek `Form` yang sama. Pilihan ini adalah subjek pada pengusangan yang dipercepat dan akan dipindahkan di Django 1.9.

### `django.template.resolve_variable()`

Fungsi ini telah secara tidak resmi ditandai sebagai "Deprecated" untuk beberapa waktu. Ganti `resolve_variable(path, context)` dengan `django.template.Variable(path).resolve(context)`.

### `django.contrib.webdesign`

Itu menyediakan etiket cetakan `lorem` yang sekarang disertakan di etiket siap-pakai. Cukup pindahkan `'django.contrib.webdesign'` dari `INSTALLED_APPS` dan `{% load webdesign %}` dari cetakan anda.

### `error_message` argumen ke `django.forms.RegexField`

Itu menyediakan kesesuaian kebelakang untuk kode pra-1.0, tetapi fungsionalitasnya berulang. Gunakan `Field.error_messages['invalid']` sebagai gantinya.

### Sintaksis `unordered_list` lama

Sebuah terlama (pra-1.0), lebih bentuk masukan terbatas dan bertele-tele untuk saringan cetakan `unordered_list` telah diusangkan:

    ['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]

Menggunakan sintaksis baru, ini menjadi:

    ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]

### `django.forms.Field._has_changed()`

Namai kembali metode ini ke `has_changed()` dengan memindahkan garis bawah di depan. Nama lama akan masih bekerja sampai Django 1.10.

### Penyaring cetakan `django.utils.html.remove_tags()` dan `removetags`

`django.utils.html.remove_tags()` sama halnya dengan saringan cetakan `removetags` telah diusangkan karena mereka tidak dapat menjamin keluaran aman.

Fungsi `django.utils.html.strip_entities()` tidak digunakan dan tidak terdokumentasikan juga telah diusangkan.

### `is_admin_site` argumen ke `django.contrib.auth.views.password_reset()`

Itu adalah pilihan warisan yang harus tidak lagi dibutuhkan.

### `SubfieldBase`

`django.db.models.fields.subclassing.SubfieldBase` telah diusangkan dan akan dipindahkan di Django 1.10. Secara riwayat, itu telah digunakan untuk menangani bidang-bidang dimana perubahan jenis dibutuhkan ketika memuat dari basisdata, tetapi itu tidak digunakan di pemanggilan `.values()` atau di pengumpulan. Itu telah diganti dengan `from_db_value()`.

Pendekatan baru tidak memanggil metode `to_python()` pada penugasan seperti dulu kasus dengan `SubfieldBase`. Jika anda butuh perilaku itu, terapkan kembali kelas `Creator` from Django's source code di proyek anda.

### `django.utils.checksums`

Modul `django.utils.checksums` telah diusangkan dan akan dipindahkan di Django 1.10. Fungsionalitas dia sediakan (memeriksa checksum menggunakan algoritma Luhn) tidak didokumentasikan dan tidak digunakan di Django. Modul telah dipindahkan ke paket django-localflavor (versi 1.1+).

### `InlineAdminForm.original_content_type_id`

Atribut `original_content_type_id` pada `InlineAdminForm` telah diusangkan dan akan dipindahkan di Django 1.10. Secara riwayat, dia digunakan untuk membangun URL `InlineAdminForm`. URL ini sekarang dapat diakses menggunakan atribut `absolute_url` pada formulir.

### Argumen `form_class` `django.views.generic.edit.FormMixin.get_form()`

Subkelas `FormMixin` yang menimpa metode `get_form()` harus memastikan menyediakan nilai awal untuk argumen `form_class` sejak itu sekarang menjadi pilihan.

### Membangun cetakan dimuat oleh `get_template()` dengan `Context`

Jenis kembalian dari `get_template()` telah berubah di Django 1.8: sebagai gantinya `django.template.Template`, itu mengembalikan instance `Template` yang jenis tepatnya bergantung pada backend mana itu dimuat.

Kedua kelas menyediakan metode `render()`, bagaimanapun, yang awal mengambil `django.template.Context` sebagai sebuah argumen selagi yang terakhir mengharapkan `dict`. Perubahan ini dipaksakan melalui jalur pengusangan untuk cetakan Django.

Semua ini juga berlaku ke `select_template()`.

### Kelas-kelas `Template` dan `Context` di cetakan tanggapan

Beberapa metode dari `SimpleTemplateResponse` dan `TemplateResponse` diterima obyek `django.template.Context` dan `django.template.Template` sebagai argumen. Mereka seharusnya menerima `dict` dan tergantung-backend obyek cetakan masing-masing.

Ini juga berlaku pada jenis kembalian jika anda mempunyai subkelas antara cetakan kelas tanggapan.

Periksa template response API documentation untuk rincian.

### Argumen `current_app` dari API cetakan-terkait

Fungsi dan kelas berikut tidak akan lagi menerima parameter `current_app` untuk menyetel namespace URL di Django 1.10:

- `django.shortcuts.render()`
- `django.template.Context()`
- `django.template.RequestContext()`
- `django.template.response.TemplateResponse()`

Setel `request.current_app` sebagai gantinya, dimana `request` adalah argumen pertama ke fungsi atau kelas ini. Jika anda sedang menggunakan `Context` polos, gunakan `RequestContext` sebagai gantinya.

### Argumen `dictionary` dan `context_instance` dari fungsi membangun

Fungsi berikut tidak lagi menerima parameter `dictionary` dan `context_instance` di Django 1.10:

- `django.shortcuts.render()`
- `django.shortcuts.render_to_response()`
- `django.template.loader.render_to_string()`

Gunakan parameter `context` sebagai gantinya. Ketika `dictionary` dilewatkan sebagai argumen penempatan, yaitu dialek paling umum, tidak ada perubahan dibutuhkan.

Jika anda sedang melewatkan `Context` di `context_instance`, lewatkan `dict` di parameter `context` sebagai gantinya. Jika anda sedang melewatkan `RequestContext`, lewatkan permintaan secara terpisah di parameter `request`.

### Argumen `dirs` dari fungsi cetakan-pencarian

Fungsi berikut tidak lagi menerima parameter `dirs` untuk menimpa `TEMPLATE_DIRS` di Django 1.10:

- `django.template.loader.get_template()`
- `django.template.loader.select_template()`
- `django.shortcuts.render()`
- `django.shortcuts.render_to_response()`

Parameter tidak bekerja secara tetap terhadap pemuat cetakan berbeda dan tidak bekerja untuk cetakan disertakan.

### `django.template.loader.BaseLoader`

`django.template.loader.BaseLoader` dinamai kembali menjadi `django.template.loader.BaseLoader`. Jika anda sedang menulis pemuat cetakan penyesuaian yang mewarisi `BaseLoader`, anda harus mewarisi `Loader` sebagai gantinya.

### `django.test.utils.TestTemplateLoader`

API pribadi `django.test.utils.TestTemplateLoader` diusangkan mendukung `django.template.loaders.locmem.Loader` dan akan dipindahkan di Django 1.9.

### Mendukung untuk argumen `max_length` pada kelas-kelas `Storage` peyesuaian

Subkelas `Storage` harus menambahkan `max_length=None` sebagai sebuah parameter pada `get_available_name()` dan/atau `save()` jika mereka menimpa baik metode. Dukungan untuk penyimpaan yang tidak menerima argumen ini akan dipindahkan di Django 1.10.

### `qn` diganti oleh `compiler`

Di versi Django sebelumnya, beragam internal cara ORM (kebanyakan cara `as_sql`) menerima sebuah argumen `qn` (untuk "mengutip nama"), yang telah diacukan ke fungsi yang mengutip penciri untuk mengirimkan ke basisdata. Di Django 1.8, argumen tersebut telah dinamai kembali ke `compiler` dan sekarang instance `SQLCompiler` penuh. Untuk kesesuaian kebelakang, memanggil instance `SQLCompiler` melakukan pengutipan-nama sama yang fungsi `qn` biasanya. Bagaimanapun, shim kesesuaian kebelakang ini segera diusangkan: anda harus menamai kembali argumen `qn` anda ke `compiler`, dan panggil `compiler.quote_name_unless_alias(...)` dimana anda sebelumnya memanggil `qn(...)`.

### Nilai awal dari `RedirectView.permanent`

Nilai awal dari atribut `RedirectView.permanent` akan berubah dari `True` menjadi `False` di Django 1.9.

### Menggunakan `AuthenticationMiddleware` tanpa `SessionAuthenticationMiddleware`

`django.contrib.auth.middleware.SessionAuthenticationMiddleware` telah ditambahkan di Django 1.7. Di 1.7.2, fungsionalitasnya telah dipindahkan ke `auth.get_user()` dan, untuk kesesuaian kebelakang, ada hanya jika `'django.contrib.auth.middleware.SessionAuthenticationMiddleware'` muncul di `MIDDLEWARE_CLASSES`..

Di Django 1.10, pengecekan sesi akan diadakan meskipun apakah atau tidak `SessionAuthenticationMiddleware` diadakan (di mana titik `SessionAuthenticationMiddleware` akan tidak mempunyai makna). Anda dapat menambahkannya ke `MIDDLEWARE_CLASSES` anda terkadang sebelum kemudian dimasukkan. Silahkan baca upgrade considerations dahulu.

### `django.contrib.sitemaps.FlatPageSitemap`

`django.contrib.sitemaps.FlatPageSitemap` telah dipindahkan ke `django.contrib.flatpages.sitemaps.FlatPageSitemap`. Tempat impor lama diusangkan dan akan dipindahkan di Django 1.9.

### Model `Field.related`

Atribut pribadi `django.db.models.Field.related` diusangkan mendukung `Field.rel`. Yang terakhir adalah sebuah instance dari `django.db.models.fields.related.ForeignObjectRel` yang menggantikan `django.db.models.related.RelatedObject`. Modul `django.db.models.related` telah dipindahkan dan atribut `Field.related` akan dipindahkan di Django 1.10.

### etiket cetakan `ssi`

Etiket cetakan `ssi` mengizinkan berkas untuk disertakan dalam sebuah cetakan oleh jalur mutlak. Ini adalah dari keterbatasan penggunaan paling di keadaan penyebaran, dan etiket `include` sering lebih masuk akal. Etiket ini sekarang diusangkan dan akan dipindahkan di Django 1.10.

### `=` sebagai perbandingan penghubung di etiket cetakan `if`

Menggunakan tanda persamaan tunggal dengan etiket cetakan `{% if %}` untuk persamaan percobaan tidak didokumentasikan dan tidak dicoba. Itu sekarang diusangkan mendukung `==`.

### `%(<foo>)s` sintaksis di `ModelFormMixin.success_url`

Warisan sintaksis `%(<foo>)s` di `ModelFormMixin.success_url` diusangkan dan akan dipindahkan di Django 1.10.

### Metode pengumpulan `GeoQuerySet`

Metode pengumpulan `collect()`, `extent()`, `extent3d()`, `make_line()`, dan `unionagg()` diusangkan dan harus diganti dengan berdasarkan-fungsi mereka pengumpulan yang sama (`Collect`, `Extent`, `Extent3D`, `MakeLine`, dan `Union`).

### Tanda tangan dari metode perute `allow_migrate`

Tanda tangan dari metode `allow_migrate()` dari perute basisdata telah berubah dari `allow_migrate(db, model)` menjadi `allow_migrate(db, app_label, model_name=None, **hints)`.

Ketika `model_name` disetel, nilai yang telah sebelumnya diberikan melalui penempatan argumen `model` mungkin tidak ditemukan didalam kamus `hints` dibawah kunci `'model'`.

Setelah berganti ke tanda tangan baru perute akan juga dipanggil oleh tindakan `RunPython` dan `RunSQL`.

## Fitur-fitur dipindahkan di 1.8

Fitur-fitur ini telah mencapai akhir siklus pengusangan mereka dan dipindahkan di Django 1.8. Lihat Fitur diusangkan di 1.6 untuk rincian, termasuk bagaimana memindahkan penggunaan fitur ini.

- `django.contrib.comments` dipindahkan.
- API pengelolaan transaksi berikut dipindahkan:
  - `TransactionMiddleware`
  - penghias dan pengelola konteks `autocommit`, `commit_on_success`, dan `commit_manually`, ditentukan di `django.db.transaction`
  - Fungsi `commit_unless_managed` dan `rollback_unless_managed`, juga ditentukan di `django.db.transaction`
  - Pengaturan `TRANSACTIONS_MANAGED`
- Etiket cetakan `cycle` dan `firstof` meloloskan otomatis argumen mereka.
- Pengaturan `SEND_BROKEN_LINK_EMAILS` dipindahkan.
- `django.middleware.doc.XViewMiddleware` dipindahkan.
- Nama lain `Model._meta.module_name` dipindahkan.
- Shim kesesuaian kebelakang diperkenalkan untuk menamai kembali `get_query_set` dan metode queryset yang mirip dipindahkan. Ini mempengaruhi kelas-kelas berikut: `BaseModelAdmin`, `ChangeList`, `BaseCommentNode`, `GenericForeignKey`, `Manager`, `SingleRelatedObjectDescriptor` dan `ReverseSingleRelatedObjectDescriptor`.
- Shim kesesuaian kebelakang diperkenalkan untuk menamai kembali atribut `ChangeList.root_query_set` dan `ChangeList.query_set` dipindahkan.
- `django.views.defaults.shortcut` dan `django.conf.urls.shortcut` dipindahkan.
- Dukungan untuk modul Python Imaging Library (PIL) dipindahkan.
- API pribadi berikut dipindahkan:
  - `django.db.backend`
  - `django.db.close_connection()`
  - `django.db.backends.creation.BaseDatabaseCreation.set_autocommit()`
  - `django.db.transaction.is_managed()`
  - `django.db.transaction.managed()`
- `django.forms.widgets.RadioInput` telah dipindah.
- Modul `django.test.simple` dan kelas `django.test.simple.DjangoTestSuiteRunner` dipindahkan.
- The module `django.test._doctest` is removed.
- Pengaturan `CACHE_MIDDLEWARE_ANONYMOUS_ONLY` dipindahkan. Perubahan ini mempengaruhi kedua `django.middleware.cache.CacheMiddleware` dan `django.middleware.cache.UpdateCacheMiddleware` meskipun kekurangan dari peringatan pengusangan di kelas terakhir.
- Penggunaan dari kode-keras Tahan "Control", atau "Command" pada Mac, untuk memilih lebih dari satu. deretan karakter untuk dikesampingkan atau ditambahkan untuk `help_text` disediakan-pengguna dalam bentuk untuk bidang model `ManyToMany` tidak dilakukan oleh Django lagi baik pada lapisan model atau formulir.
- Metode `Model._meta.get_(add|change|delete)_permission` dipindahkan.
- Kunci sesi `django_language` tidak lagi membaca untuk kesesuaian kebelakang.
- Peta situs geografis dipindahkan (`django.contrib.gis.sitemaps.views.index` dan `django.contrib.gis.sitemaps.views.sitemap`).
- `django.utils.html.fix_ampersands`, saringan cetakan `fix_ampersands`, dan `django.utils.html.clean_html` dipindahkan.