# Dokumentasi Django 5.2.8

# Catatan terbitan Django 1.10

Agustus 1, 2016

Selamat datang di Django 1.10!

Catatan terbitan ini melingkupi new features, sama halnya beberapa backwards incompatible changes anda ingin sadari dari ketika meningkatkan dari Django 1.9 atau versi terlama. Kami telah dropped some features yang telah mencapai akhir dari siklus pengusangan mereka, dan kami telah begun the deprecation process for some features.

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

## Kesesuaian Python

Seperti Django 1.9, Django 1.10 membutuhkan Python 2.7, 3.4, atau 3.5. Kami sangat menganjurkan dan hanya secara resmi mendukung terbitan terakhir dari setiap rangkaian.

## Apa yang baru di Django 1.10

### Pencarian teks penuh untuk PostgreSQL

`django.contrib.postgres` sekarang menyertakan collection of database functions untuk mengizinkan penggunaan dari pencarian teks penuh mesin pencarian. Anda dapat mencari lintas bidang banyak di hubungan basisdata, memadukan pencarian dengan pencarian lain, menggunakan konfigurasi dan pembobotan bahasa berbeda, dan memangkatkan hasil berdasarkan pertalian.

Itu juga sekarang menyertakan dukungan trigram, menggunakan pencarian `trigram_similar`, dan pernyataan `TrigramSimilarity` dan `TrigramDistance`.

### Middleware gaya-baru

A new style of middleware is introduced to solve the lack of strict request/response layering of the old-style of middleware described in DEP 0005. You'll need to adapt old, custom middleware and switch from the `MIDDLEWARE_CLASSES` setting to the new `MIDDLEWARE` setting to take advantage of the improvements.

### Dukungan resmi untuk nama pengguna Unicode

Model `User` dalam `django.contrib.auth` aslinya hanya menerima huruf ASCII dan angka dalam nama penggna. Meskipun itu bukan pilhan disengaja, karakter Unicode selalu diterima ketika menggunakan Python 3.

Validator username saat ini menerima karakter Unicode secara default hanya di Python 3.

Penyesuaian model user mungkin menggunakan `ASCIIUsernameValidator` atau `UnicodeUsernameValidator`.

### Fitur kecil

#### `django.contrib.admin`

- Untuk situs-situs berjalan pada subjalur, `URL awal untuk tautan "View site"` pada atas dari setiap halaman admin akan sekarang menunjuk ke `request.META['SCRIPT_NAME']` jika disetel, daripada `/`.

- Pesan berhasil yang muncul setelah menambahkan atau menyunting sebuah obyek sekarang mengandung sebuah tautan ke formulir rubah obyek.

- Semua deretan JavaScript dipindahkan jadi anda dapat mengadakan kepala HTTP `Content-Security-Policy` jika anda ingin.

- Atribut `InlineModelAdmin.classes` baru mengizinkan menetapkan kelas-kelas pada deretam kumpulan bidang. Berderet dengan kelas `collapse` akan awalnya diruntuhkan dan kepala mereka akan mempunyai tautan "show" kecil.

- If a user doesn't have the add permission, the `object-tools` block on a model's changelist will now be rendered (without the add button). This makes it easier to add custom tools in this case.

- Model `LogEntry` sekarang menyimpan pesan-pesan berubah di struktur JSON sehingga pesan dapat secara dinamis diterjemahkan menggunakan bahasa aktif saat ini. Metode `LogEntry.get_change_message()` baru sekarang dipilih dari mengambil pesan berubah.

- Obyek terpilih untuk bidang di `ModelAdmin.raw_id_fields` sekarang mempunyai sebuah tautan ke formulir rubah obyek.

- Ditambahkan pilihan "No date" dan "Has date" untuk `DateFieldListFilter` jika bidang adalah nullable.

- Pustaka jQuery ditanam di admin ditingkatkan dari versi 2.1.4 ke 2.2.3.

#### `django.contrib.auth`

- Ditambahkan dukungan untuk Argon2 password hash. Dianjurkan terhadap PBKDF2, bagaimanapun, itu bukan awal seperti itu membutuhkan pustaka pihak-ketiga.

- Perhitungan perulangan awal untuk pengacak sandi PBKDF2 telah ditingkatkan oleh 25%. Perubahan kesesuaian kebelakang tidak akan mempengaruhi pengguna yang mempunyai subkelas `django.contrib.auth.hashers.PBKDF2PasswordHasher` untuk merubah nilai awal.

- Tampilan `django.contrib.auth.views.logout()` mengirim kepala "no-cache" untuk mencegah sebuah masalah dimana cache Safari pengalihan dan mencegah seorang pengguna menjadi dapat keluar.

- Ditambahkan argumen pilihan `backend` pada `django.contrib.auth.login()` untuk menggunakan itu tanpa without surat pengenal.

- Pengaturan `LOGOUT_REDIRECT_URL` baru mengendalikan pengalihan dari tampilan `logout()`, jika tampilan tidak mendapatkan argumen `next_page`.

- Parameter `redirect_authenticated_user` baru untuk tampilan `django.contrib.auth.views.login()` mengizinkan pengalihan pengguna terautentifikasi mengunjungi halaman masuk.

- `AllowAllUsersModelBackend` dan `AllowAllUsersRemoteUserBackend` baru mengabaikan nilai dari `User.is_active`, selagi `ModelBackend` dan `RemoteUserBackend` sekarang menolak pengguna tidak aktif.

#### `django.contrib.gis`

- Distance lookups sekarang menerima pernyataan sebagai jarak parameter nilai.

- Harta `GEOSGeometry.unary_union` baru menghitung gabungan dari semua unsur dari geometri ini.

- Ditambahkan sebutan biner `GEOSGeometry.covers()`.

- Ditambahkan metode `GDALBand.statistics()` dan atribut `mean` dan `std`.

- Ditambahkan dukungan untuk pengumpulan fungsi `MakeLine` dan `GeoHash` pada SpatiaLite.

- Ditambahkan dukungan untuk fungsi `Difference`, `Intersection`, dan `SymDifference` pada MySQL.

- Ditambahkan dukungan untuk instantisi geometri GEOS kosong.

- Harta `trim` dan `precision` baru dari `WKTWriter` mengizinkan mengendalikan keluaran dari bagian pecahan dari kordinat di WKT.

- Ditambahkan harta `LineString.closed` dan `MultiLineString.closed`.

- GeoJSON serializer sekarang mengeluarkan primary key dari obyek di kamus `properties` jika bidang tertentu tidak ditetapkan.

- Kemampuan melipat data masukan pada metode `GDALBand.data()` telah ditambahkan. Pita data sekarang dapat diperbaharui dengan nilai berulang secara efisien.

- Ditambahkan fungsi basisdata `IsValid` dan `MakeValid`, sama halnya seperti pencarian `isvalid`, semua untuk PostGIS. Ini mengizinkan menyaring dan memperbaiki geometri tidak sah pada sisi basisdata.

- Ditambahkan dukungan raster untuk semua spatial lookups.

#### `django.contrib.postgres`

- Untuk meyakinkan, `HStoreField` sekarang memberikan kunci dan nilainya ke deretan karakter.

#### `django.contrib.sessions`

- Perintah pengelolaan `clearsessions` sekarang memindahkan sesi berdasarkan-berkas.

#### `django.contrib.sites`

- Model `Site` sekarang mendukung natural keys.

#### `django.contrib.staticfiles`

- Etiket cetakan `static` sekarang menggunakan `django.contrib.staticfiles` jika itu didalam `INSTALLED_APPS`. Ini khususnya berguna untuk aplikasi pihak ketiga yang dapat sekarang selalu menggunakan `{% load static %}` (sebagai gantinya dari `{% load staticfiles %}` atau `{% load static from staticfiles %}`) dan tidak khawatir tentang apakah atau tidak aplikasi `staticfiles` terpasang.

- Anda dapat more easily customize 1 pilihan `collectstatic --ignore` dengan `AppConfig` penyesuaian.

#### Tembolok

- Backend tembolok berdasarkan-berkas sekarang menggunakan protokol pengasaman tertinggi.

#### CSRF

- `CSRF_FAILURE_VIEW` awal, `views.csrf.csrf_failure()` sekarang menerima sebuah pilihan parameter `template_name`, awal ke `'403_csrf.html'`, untuk mengendalikan cetakan digunakan untuk membangun halaman.

- Untuk melindungi terhadap serangan BREACH, mekanisme perlindungan CSRF sekarang merubah nilai token formulir pada setiap permintaan (selagi menjaga sebuah rahasia tidak berubah yang dapat digunakan untuk mensahkan token berbeda).

#### Backend basisdata

- Pengurangan data sementara telah digabungkan pada semua backend.

- Jika basisdata mendukungnya, backend dapat menyetel `DatabaseFeatures.can_return_ids_from_bulk_insert=True` dan menerapkan `DatabaseOperations.fetch_returned_insert_ids()` untuk menyetel primary key pada obyek dibuat menggunakan `QuerySet.bulk_create()`.

- Ditambahkan argumen kata kunci pada metode `as_sql()` dari beragam pernyataan (`Func`, `When`, `Case`, dan `OrderBy`) untuk mengizinkan backend basisdata untuk menyesuaikan mereka tanpa mengubah `self`, yang tidak aman menggunakan backend basisdata berbeda. Lihat parameter `arg_joiner` dan `**extra_context` dari `Func.as_sql()` untuk sebuah contoh.

#### Penyimpanan Berkas

- Backend penyimpanan sekarang menghadirkan API sadar-zona waktu dengan metode baru `get_accessed_time()`, `get_created_time()`, dan `get_modified_time()`. Mereka mengembalikan `datetime` waspada zona waktu jika `USE_TZ` adalah `True` dan `datetime` tidak dibuat-buat di zona waktu lokal jikalau tidak.

- Metode `Storage.generate_filename()` baru membuatnya semakin mudah untuk menerapkan penyimpanan penyesuaian yang tidak menggunakan `os.path` memanggil sebelumnya di `FileField`.

#### Formulir

- Formulir dan widget `Media` sekarang dilayani menggunakan `django.contrib.staticfiles` jika terpasang.

- Etiket `<input>` dibangun oleh `CharField` sekarang menyertakan atribut `minlength` jika bidang mempunyai `min_length`.

- Bidang formulir yang diwajibkan sekarang mempunyai atribut HTML `required`. Setel atribut `Form.use_required_attribute` baru menjadi `False` untuk meniadakannya. Atribut `required` tidak disertakan pada formulir dari formset karena pengesahan peramban mungkin tidak benar ketika menambahkan dan menghapus formset.

#### Tampilan Umum

- Kelas `View` sekarang dapat diimpor dari `django.views`.

#### Internasionalisasi

- Fungsi pembantu `i18n_patterns()` sekrang dapat digunakan di akar URLConf ditentukan menggunakan `request.urlconf`.

- Dengan menyetel parameter `prefix_default_language` baru untuk `i18n_patterns()` menjadi `False`, anda dapat mengizinkan mengakses bahasa awal tanpa awalan URL.

- `set_language()` sekarang mengembalikan kode keadaan 204 (Tidak ada Isi) untuk permintaan AJAX ketika tidak ada parameter `next` di `POST` atau `GET`.

- Tampilan berdasarkan kelas `JavaScriptCatalog` dan `JSONCatalog` menggantikan pengusangan tampilan berdasarkan fungsi `javascript_catalog()` dan `json_catalog()`. Tampilan baru hampir sama ke yang lama kecuali itu oleh awal tampilan baru mengumpulkan semua deretan karakter JavaScript di ranag terjemahan `djangojs` dari semua aplikasi terpasang daripada hanya deretan karakter JavaScript dari `LOCALE_PATHS`.

#### Pengelolaan perintah

- `call_command()` sekarang mengembalikan nilai dikembalikan dari metode `command.handle()`.

- Pilihan `check --fail-level` baru mengizinkan menentukan tingkatan pesan yang akan menyebabkan perintah keluar dengan keadaan bukan nol.

- Pilihan `makemigrations --check` baru membuat perintah keluar dengan keadaan bukan nol ketika model berubah tanpa perpindahan dikenali.

- `makemigrations` sekarang menampilkan jalur ke berkas perpindahan yang dia bangkitkan.

- Pilihan `shell --interface` sekarang menerima `python` untuk memaksa menggunakan penafsir Python `plain`.

- Pilihan `shell --command` baru membiarkan anda menjalankan perintah sebagai Django dan keluar, daripada membuka shell interaktif.

- Ditambahkan peringatan ke `dumpdata` jka model proxy ditentukan (yang menghasilkan tidak ada keluaran) tanpa wujud induknya.

- Atribut `BaseCommand.requires_migrations_checks` baru mungkin disetel menjadi `True` jika anda ingin perintah anda mencetak peringatan, seperti `runserver` lakukan, jika kumpulan dari perpindahan pada cakram tidak cocok perpindahan di basisdata.

- Untuk memandu dengan percobaan, `call_command()` sekarang menerima obyek perintah sebagai argumen pertama.

- Perintah `shell` mendukung penyelesaian label pada sistem menggunakan `libedit`, misalnya macOS.

- Perintah `inspectdb` membiarkan anda memilih tabel apa harus diperiksa dengan menentukan nama-nama mereka sebagai argumen.

#### Perpindahan

- Ditambahkan dukungan untuk serialisasi dari obyek `enum.Enum`.

- Ditambahkan argumen `elidable` pada tindakan `RunSQL` dan `RunPython` untuk mengizinkan mereka dipindahkan ketika melumat perpindahan.

- Ditambahkan dukungan untuk non-atomic migrations dengan mengatur atribut `atomic` pada `Migration`.

- Perintah `migrate` dan `makemigrations` sekarang check for a consistent migration history. Jika mereka menemukan beberapa ketergantungan yang tidak berlaku pada sebuah perpindahan yang dilakukan, `InconsistentMigrationHistory` muncul.

- Sinyal `pre_migrate()` dan `post_migrate()` sekarang mengirim perpindahan `plan` dan `apps` mereka.

#### Model

- Membalikkan foreign key dari model proxy sekarang diperbanyak ke wujud kelas mereka. Membalikkan hubungan dilampirkan oleh `ForeignKey` menunjuk ke model proxy sekarang tersedia sebagai penjelasan pada kelas model yang di proxy kan dan mungkin diacukan di penyaring queryset.

- Metode `Field.rel_db_type()` baru mengembalikan jenis data basisdata untuk bidang seperti `ForeignKey` dan `OneToOneField` yang menunjuk ke bidang lain.

- Atribut kelas `arity` ditambahkan ke `Func`. Atribut ini dapat digunakan untuk menyetel sejumlah argumen fungis penerimaan.

- Ditambahkan `BigAutoField` yang bertindak seperti sebuah pengecualian `AutoField` yang di jaminkan untuk mencocokkan angka dari `1` sampai `9223372036854775807`.

- `QuerySet.in_bulk()` mungkin dipanggil tanpa argumen apapun untuk mengembalikan semua obyek di queryset.

- `related_query_name` sekarang mendukung label aplikasi dan penyisipan kelas menggunakan deretan karakter `'%(app_label)s'` dan `'%(class)s'`.

- Diizinkan mengutamakan bidang model diwariskan dari kelas-kelas berdasarkan abstrak.

- Fungsi `prefetch_related_objects()` sekarang APU umum.

- `QuerySet.bulk_create()` menyetel primary key pada obyek ketika menggunakan PostgreSQL.

- Ditambahkan fungsi basisdata `Cast`.

- Sebuah model proxy mungkin sekarang mewarisi banyak model proxy yang berbagi kelas induk bukan-abstrak umum.

- Ditambahkan fungsi-fungsi `Extract` untuk mengambil komponen-komponen datetime sebagai integer, seperti tahun dan jam.

- Ditambahkan fungsi-fungsi `Trunc` untuk memotong tanggal atau datetime pada komponen penting. Mereka mengadakan permintaan seperti penjualan-per-hari atau penjualan-per-jam.

- `Model.__init__()` sekarang menyetel nilai dari bidang maya dari argumen kata kuncinya.

- Pilihan `Meta.base_manager_name` dan `Meta.default_manager_name` baru mengizinkan mengendalikan `_base_manager` dan `_default_manager`, masing-masing.

#### Permintaan dan Tanggapan

- Ditambahkan `request.user` pada tampilan mencai kesalahan.

- Added `HttpResponse` methods `readable()` and `seekable()` to make an instance a stream-like object and allow wrapping it with `io.TextIOWrapper`.

- Ditambahkan atribut `HttpRequest.content_type` dan `content_params` yang diuraikan dari kepala `CONTENT_TYPE`.

- Pengurai untuk `request.COOKIES` disederhanakan untuk perilaku pencocokan lebih baik dari peramban `request.COOKIES` sekarang mengandung kue yang tidak sah menurut RFC 6265 tetapi memunginkan menyetel melalui `document.cookie`.

#### Serialisasi

- `django.core.serializers.json.DjangoJSONEncoder` sekarang mengetahui bagaimana menserialisasikan deretan karakter lazy, khususnya digunakan untuk isi terjemahan.

#### Templat

- Ditambahkan pilihan `autoescape` pada backend `DjangoTemplates` dan kelas `Engine`.

- Ditambahkan penghubung perbandingan `is` dan `is not` pada etiket `if`.

- Diizinkan `dictsort` untuk mengurutkan daftar dari daftar oleh unsur pada indeks yang ditentukan.

- Pengolah konteks `debug()` mengandung permintaan untuk semua nama lain basisdata daripada hanya nama lain awalan.

- Ditambahkan dukungan jalur relatif untuk argumen deretan karakter dari etiket cetakan `extends` dan `include`.

#### Pengujian

- Untuk penangkapan kesalahan lebih baik, `TestCase` sekarang memeriksa batasan basisdata dapat ditunda pada akhir setiap percobaan.

- Percobaan dan kasus percobaan dapat di marked with tags dan dijalankan dipilih-pilih dengan pilihan `test --tag` dan `test --exclude-tag` baru.

- Anda sekarang dapat masuk dan menggunakan sesi dengan klien percobaan bahkan jika `django.contrib.sessions` tidak di `INSTALLED_APPS`.

#### URL

- An addition in `django.setup()` allows URL resolving that happens outside of the request/response cycle (e.g. in management commands and standalone scripts) to take `FORCE_SCRIPT_NAME` into account when it is set.

#### Pengesah

- `URLValidator` sekarang membatasi panjang dari label nama ranah sampai 63 karakter dan jumlah panjang dari nama ranah sampai 253 karakter per RFC 1034.

- `int_list_validator()` sekarang menerima sebuah pilihan `allow_negative` parameter boolean, nilai awal ke `False`, untuk mengizinkan integer negatif.

## Perubahan bertentangan kebelakang di 1.10

Peringatan

Sebagai tambahan pada uraian berubah di bagian ini, pastikan meninjau Fitur-fitur dipindahkan di 1.10 untuk fitur yang telah mencapai akhir dari siklus pengusangan mereka dan karena itu telah dipindahkan. Jika anda belum memperbaharui kode anda dalam linimasa pengusangan untuk fitur diberikan, perpindahan ini mungkin muncul sebagai perubahan ketidaksesuaian kebelakang.

### API backend basisdata

- `AreaField` GIS menggunakan jenis numerik dasar tidak ditentukan yang dapat dalam praktiknya menjadi jenis Python numerik apapun. Nilai `decimal.Decimal` diambil dari basisdata sekarang dirubah menjadi `float` untuk membuatnya lebih mudah memadukan mereka dengan nilai-nilai digunakan oleh pustaka GIS.

- Untuk mengadakan pengurangan sementara anda harus menyetel bendera fitur basisdata `supports_temporal_subtraction` menjadi `True` dan menerapkan metode `DatabaseOperations.subtract_temporals()`. Cara ini harus mengembalikan SQL dan parameter yang dibutuhkan untuk menghitung perbedaan dalam mikrodetik diantara argumen `lhs` dan `rhs` di jenis data digunakan untuk menyimpan `DurationField`.

### `select_related()` melarang bidang bukan-berhubungan untuk hubungan bersarang

Django 1.8 added validation for non-relational fields in `select_related()`:

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

But it didn't prohibit nested non-relation fields as it does now:

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

### `_meta.get_fields()` mengembalikan kesesuaian bidang membalikkan untuk model proxy

Sebelum Django 1.10, metode `get_fields()` mengembalikan bidang membalikkan yang berbeda ketika dipanggil pada model dibandingkan pada wujud kelas yang diwakilkan. Ketidaksesuaian telah diperbaiki dengan mengembalikan sekumpulan penuh dari bidang-bidang menunjuk ke kelas berwujud atau satu dari wakilnya di kedua kasus.

### `AbstractUser.username` `max_length` ditingkatkan sampai 150

Sebuah perpindahan `django.contrib.auth.models.User.username` disertakan. Jika anda mempunyai model pengguna penyesuaian diwariskan dari `AbstractUser`, anda akan butuh membangkitkan dan berlakukan perpindahan basisdata untuk model pengguna anda.

We considered an increase to 254 characters to more easily allow the use of email addresses (which are limited to 254 characters) as usernames but rejected it due to a MySQL limitation. When using the `utf8mb4` encoding (recommended for proper Unicode support), MySQL can only create unique indexes with 191 characters by default. Therefore, if you need a longer length, please use a custom user model.

Jika anda ingin menyediakan batas 30 karakter untuk nama pengguna, gunakan formulir penyesuaian ketika membuat pengguna atau merubah nama pengguna:

    from django.contrib.auth.forms import UserCreationForm

    class MyUserCreationForm(UserCreationForm):
        username = forms.CharField(
            max_length=30,
            help_text="Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.",
        )

Jika anda berharap menjaga batasan ini di admin, setel `UserAdmin.add_form` untuk menggunakan formulir ini:

    from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
    from django.contrib.auth.models import User

    class UserAdmin(BaseUserAdmin):
        add_form = MyUserCreationForm

    admin.site.unregister(User)
    admin.site.register(User, UserAdmin)

### Dibuang dukungan untuk PostgreSQL 9.1

Dukungan hulu untuk PostgreSQL 9.1 berakhir di September 2016. Sebagai konsekuensinya, Django 1.10 menyetel PostgreSQL 9.2 sebagai versi minimal dia secara resmi dukung.

### Keluaran `runserver` melewati pencatatan

Menangani permintaan dan tanggapan dari perintah `runserver` dikirim ke pencatat django.server sebagai gantinya pada `sys.stderr`. Jika anda meniadakan konfigurasi pencatatan Django atau menimpa dengan anda sendiri, anda akan butuh menambahkan konfigurasi pencatatan yang sesuai jika anda ingin melihat keluaran itu:

    LOGGING = {
        # ...
        "formatters": {
            "django.server": {
                "()": "django.utils.log.ServerFormatter",
                "format": "[%(server_time)s] %(message)s",
            }
        },
        "handlers": {
            "django.server": {
                "level": "INFO",
                "class": "logging.StreamHandler",
                "formatter": "django.server",
            },
        },
        "loggers": {
            "django.server": {
                "handlers": ["django.server"],
                "level": "INFO",
                "propagate": False,
            }
        },
    }

### Model percobaan `auth.CustomUser` dan `auth.ExtensionUser` dipindahkan.

Sejak perkenalan dari perpindahan untuk bantuan aplikasi di Django 1.8, tabel dari model percobaan pengguna penyesuaian ini tidak dibuat lagi membuat mereka tidak berguna dalam konteks percobaan.

### Registrar aplikasi tidak lagi otomatis dikumpulkan ketika membongkar model diluar Django

The apps registry is no longer auto-populated when unpickling models. This was added in Django 1.7.2 as an attempt to allow unpickling models outside of Django, such as in an RQ worker, without calling `django.setup()`, but it creates the possibility of a deadlock. To adapt your code in the case of RQ, you can provide your own worker script that calls `django.setup()`.

### Dipindahkan pemeriksaan penugasan null untuk bidang foreign key bukan-null

Dalam versi terlama, menugaskan `None` pada `ForeignKey` atau `OneToOneField` nukan-null memunculkan `ValueError('Cannot assign None: "model.field" does not allow null values.')`. Untuk ketidakkonsistenan dengan bidang model lain yang tidak mempunyai pemeriksaan sama, pemeriksaan ini dipindahkan.

### Dipindahkan pengacak sandi lemah dari pengaturan `PASSWORD_HASHERS` awal

Django 0.90 menyimpan sandi sebagai MD5 tidak tergarami. Django 0.91 ditambahkan dukungan untuk SHA1 tergarami dengan peningkatan otomatis dari sandi ketika penggina masuk. Django 1.4 ditambahkan PBKDF2 sebagai pengacak sandi awal.

If you have an old Django project with MD5 or SHA1 (even salted) encoded passwords, be aware that these can be cracked fairly easily with today's hardware. To make Django users acknowledge continued use of weak hashers, the following hashers are removed from the default `PASSWORD_HASHERS` setting:

- `"django.contrib.auth.hashers.SHA1PasswordHasher"`

- `"django.contrib.auth.hashers.MD5PasswordHasher"`

- `"django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher"`

- `"django.contrib.auth.hashers.UnsaltedMD5PasswordHasher"`

- `"django.contrib.auth.hashers.CryptPasswordHasher"`

Pertimbangkan menggunakan wrapped password hasher untuk menguatkan campuran di basisdata anda. Jika itu tidak layak, tambah pengaturan `PASSWORD_HASHERS` ke proyek anda dan tambah kembali pencampur apapun yang anda butuhkan.

Anda dapat memeriksa jika basisdata anda mempunyai tiap dari pengacak dipindahkan seperti ini:

    from django.contrib.auth import get_user_model

    User = get_user_model()

    # Unsalted MD5/SHA1:
    User.objects.filter(password__startswith="md5$$")
    User.objects.filter(password__startswith="sha1$$")
    # Salted MD5/SHA1:
    User.objects.filter(password__startswith="md5$").exclude(password__startswith="md5$$")
    User.objects.filter(password__startswith="sha1$").exclude(password__startswith="sha1$$")
    # Crypt hasher:
    User.objects.filter(password__startswith="crypt$$")

    from django.db.models import CharField
    from django.db.models.functions import Length

    CharField.register_lookup(Length)
    # Unsalted MD5 passwords might not have an 'md5$$' prefix:
    User.objects.filter(password__length=32)

### Metode `Field.get_prep_lookup()` dan `Field.get_db_prep_lookup()` dipindahkan.

Jika anda mempunyai bidang penyesuaian yang menerapkan baik metode ini, mendaftarkan pencarian penyesuaian untuknya. Sebagai contoh:

    from django.db.models import Field
    from django.db.models.lookups import Exact

    class MyField(Field): ...

    class MyFieldExact(Exact):
        def get_prep_lookup(self):
            # do_custom_stuff_for_myfield
            ...

    MyField.register_lookup(MyFieldExact)

### `django.contrib.gis`

- Dukungan untuk SpatiaLite < 3.0 dan GEOS < 3.3 dibuang.

- Nama lain kesesuaian kebelakang `add_postgis_srs()` untuk `django.contrib.gis.utils.add_srs_entry()` dipindahkan.

- Pada Oracle/GIS, fungsi pengumpulan `Area` sekarang mengembalikan `float` daripada `decimal.Decimal`. (Itu masih dibungkus dalam ukuran meter persegi.)

- Perwakilan `GEOSGeometry` awal (keluaran WKT) dipangkas secara awal. Yaitu, daripada `POINT (23.0000000000000000 5.5000000000000000)`, anda akan mendapatkan `POINT (23 5.5)`.

### Ukuran maksimum dari permintaan badan dan angka dari parameter GET/POST dibatasi

Dua pengaturan baru membantu mengurangi serangan denial-of-service melalui permintaan besar:

- `DATA_UPLOAD_MAX_MEMORY_SIZE` limits the size that a request body may be. File uploads don't count toward this limit.

- `DATA_UPLOAD_MAX_NUMBER_FIELDS` membatasi angka dari parameter GET/POST yang diuraikan.

Aplikasi yang menerima penempatan formulir tidak biasanya besar mungkin butuh merubah pengaturan ini.

### Bermacam-macam

- `repr()` dari `QuerySet` dibungkus dalam `<QuerySet >` untuk memindahkan kedua artian nya dari daftar kosong ketika mencari kesalahan.

- `utils.version.get_version()` mengembalikan PEP 440 versi calon terbitan (sebagai contoh '1.10rc1' instead of '1.10c1').

- Nilai token CSRF sekarang diwajibkan menjadi deretan karakter 64 alfanumerik; nilai dari 32 alfanumerik, seperti disetel oleh versi terlama Django secara awal, otomatis diganti dengan deretan karakter dari 64 karakter. Nilai lain dianggap tidak sah. Ini harus hanya mempengaruhi pengembang atau pengguna yang mengganti token ini.

- Pengaturan `LOGOUT_URL` dipindahkan sebagai Django belum membuat menggunakannya sejak pra-1.0. Jika anda ingin menggunakannya di proyek anda, anda dapat menambahkannya ke pengaturan proyek anda. Nilai awal adalah `'/accounts/logout/'`.

- Obyek dengan metode `close()` seperti berkas dan pembangkit dilewatkan ke `HttpResponse` sekarang ditutup segera sebagai gantinya ketika peladen WSGI memanggil `close()` pada tanggapan.

- Memanggil `transaction.atomic()` berlebihan dalam `QuerySet.update_or_create()` dipindahkan. Ini mungkin mempengaruhi permintaan perhitungan dicoba oleh `TransactionTestCase.assertNumQueries()`.

- Dukungan untuk `skip_validation` di `BaseCommand.execute(**options)` dipindahkan. Gunakan `skip_checks` (ditambahkan di Django 1.7) sebagai gantinya.

- `loaddata` sekarang memunculkan sebuah `CommandError` sebagai gantinya dari menampilkan sebuah peringatan ketika berkas peralatan tetap ditentukan tidak ditemukan.

- Daripada secara langsung mengakses atribut `LogEntry.change_message`, sekarang lebih baik memanggil metode `LogEntry.get_change_message()` yang akan menyediakan pesan di bahasa saat ini.

- Tampilan kesalahan awal sekarang menampilkan `TemplateDoesNotExist` jika `template_name` tidak ada ditentukan.

- Argumen kata kunci `choices` tidak digunakan dari widgets `Select` dan `SelectMultiple` metode `render()` dipindahkan. Argumen `choices` dari metode `render_options()` juga dipindahkan, membuat `selected_choices` argumen pertama.

- Percobaan yang melanggar penundaan batasan basisdatasekarang akan salah ketika berjalan pada sebuah basisdata yang mendukung batasan penundaan.

- Perintah pengelolaan pasang-tetap sekarang menggunakan pengindeksan dari kunci di `options`, sebagai contoh `options['verbosity']`, daripada `options.get()` dan tidak lagi melakukan jenis paksaan apapun. Ini dapat menjadi sebuah masalah jika anda sedang memanggil perintah menggunakan `Command.execute()` (yang melewatkan pengurai argumen yang menyetel nilai awalan) daripada `call_command()`. Daripada memanggil `Command.execute()`, lewati obyek perintah sebagai argumen pertama untuk `call_command()`.

- `ModelBackend` dan `RemoteUserBackend` sekarang menolak pengguna tidak aktif. Ini berarti bahwa pengguna tidak aktif tidak dapat masuk dan akan keluar jika mereka diganti dari `is_active=True` menjadi `False`. Jika anda butuh perilaku sebelumnya, gunakan `AllowAllUsersModelBackend` atau `AllowAllUsersRemoteUserBackend` di `AUTHENTICATION_BACKENDS` sebagai gantinya.

- In light of the previous change, the test client's `login()` method no longer always rejects inactive users but instead delegates this decision to the authentication backend. `force_login()` also delegates the decision to the authentication backend, so if you're using the default backends, you need to use an active user.

- `django.views.i18n.set_language()` sekarang mungkin mengembalikan kode keadaan 204 untuk permintaan AJAX.

- The `base_field` attribute of `RangeField` is now a type of field, not an instance of a field. If you have created a custom subclass of `RangeField`, you should change the `base_field` attribute.

- Kelas-kelas middleware sekarang diinisialisasikan ketika peladen mulai daripada selama permintaan pertama.

- Jika anda menimpa `is_authenticated()` atau `is_anonymous()` dalam model pengguna penyesuaian, anda harus merubah mereka ke atribut atau sifat seperti digambarkan di the deprecation note.

- Ketika menggunakan `ModelAdmin.save_as=True`, tombol "Save as new" sekarang mengalihkan ke merubah tampilan untuk obyek baru daripada ke daftar rubah model. Jika anda butuh perilaku sebelumnya, setel atribut `ModelAdmin.save_as_continue` baru menjadi `False`.

- Bidang-bidang formulir diwajibkan sekarang mempunyai atribut HTML `required`. Setel atribut `Form.use_required_attribute` menjadi `False` untuk meniadakannya. Anda dapat juga menambah atribut `novalidate` pada `<form>` jika anda tidak ingin pengesahan peramban. Untuk meniadakan atribut `required` pada widget penyesuaian, menimpa metode `Widget.use_required_attribute()`.

- The WSGI handler no longer removes content of responses from `HEAD` requests or responses with a `status_code` of 100-199, 204, or 304. Most web servers already implement this behavior. Responses retrieved using the Django test client continue to have these "response fixes" applied.

- `Model.__init__()` sekarang menerima `django.db.models.DEFERRED` sebagai nilai dari bidang-bidang yang ditangguhkan.

- Atribut `Model._deferred` dpindahkan sebagai kelas-kelas model dinamis ketika menggunakan `QuerySet.defer()` dan `only()` dipindahkan.

- `Storage.save()` tidak lagi mengganti `'\'` dengan `'/'`. Perilaku ini dipindahkan ke `FileSystemStorage` sejak ini adalah rincian penerapan penyimpanan khusus. Tiap pengguna Windows dengan penerapan penyimpanan penyesuaian yang mengandalkan pada perilaku ini akan butuh menerapkannya di metode `save()` penyimpanan penyesuaian.

- Metode `FileField` pribadi `get_directory_name()` dan `get_filename()` tidak lagi dipanggil (dan sekarang diusangkan) yaitu perubahan ketidaksesuaian kebelakang untuk pengguna mengutamakan metode-metode tersebut pada bidang penyesuaian. Untuk menyesuaikan kode seperti itu, timpa `FileField.generate_filename()` atau `Storage.generate_filename()` sebagai gantinya. Itu dapat memungkinkan menggunakan `upload_to` juga.

- Subjek dari surel dikirim oleh `AdminEmailHandler` tidak lagi dipotong pada karakter 989. Jika anda menghitung pada batasan panjang, potong subjek anda sendiri.

- Pernyataan pribadi `django.db.models.expressions.Date` dan `DateTime` dipindahkan. Pernyataan `Trunc` baru menyediakan kegunaan sama.

- Atribut `_base_manager` dan `_default_manager` dipindahkan dari instance model. Mereka tetap dapat diakses pada kelas model.

- Mengakses bidang terhapus pada instance model, sebagai contoh setelah del obj.field`, muat kembali nilai bidang daripada memunculkan `AttributeError`.

- Jika anda subkelas `AbstractBaseUser` dan menimpa `clean()`, pastikan itu memanggil `super()`. `AbstractBaseUser.normalize_username()` dipanggil di metode `AbstractBaseUser.clean()` baru.

- API pribadi `django.forms.models.model_to_dict()` mengembalikan sebuah queryset daripada sebuah daftar dari primary key untuk `ManyToManyField`.

- Jika `django.contrib.staticfiles` dipasang, etiket cetakan `static` menggunakan penyimpanan `staticfiles` untuk membangun URL daripada cukup menggabungkan nilai dengan `STATIC_ROOT`. Pendekatan baru menyandi URL, yang mungkin ketidaksesuaian-kebelakang di kasus seperti menyertakan sebuah fragmen dalam sebuah jalur, sebagai contoh `{% static 'img.svg#fragment' %}`, sejak `#` disandikan sebagai `%23`. Untuk menyesuaikan, pindah fragmen diluar etiket cetakan: `{% static 'img.svg' %}#fragment`.

- When `USE_L10N` is `True`, localization is now applied for the `date` and `time` filters when no format string is specified. The `DATE_FORMAT` and `TIME_FORMAT` specifiers from the active locale are used instead of the settings of the same name.

## Fitur-fitur diusangkan di 1.10

### Penugasan langsung untuk membalikkan foreign key atau hubungan many-to-many.

Instead of assigning related objects using direct assignment:

    >>> new_list = [obj1, obj2, obj3]
    >>> e.related_set = new_list

Use the `set()` method added in Django 1.9:

    >>> e.related_set.set([obj1, obj2, obj3])

Ini mencegah kebingungan tentang sebuah penugasan menghasilkan sebuah tersirat tersimpan.

### API `Storage` bukan-sadar-zona waktu

Yang lama, metode bukan-sadar-zona waktu `accessed_time()`, `created_time()`, dan `modified_time()` diusangkan dalam mendukung dari metode `get_*_time()` baru.

Backend penyimpanan pihak-ketiga harus menerapkan metode baru dan tandai satu yang lama sebagai diusangkan. Sampai kemudian, cara `get_*_time()` baru pada kelas `Storage` dasar merubah `datetime` dari metode lama sebagai diwajibkan dan mengeluarkan peringatan pengusangan seperti mereka lakukan.

Backend penyimpanan pihak ketiga mungkin mempertahankan metode lama selama mereka berharap mendukung versi sebelumnya dari Django.

### `django.contrib.gis`

- Metode `get_srid()` dan `set_srid()` dari `GEOSGeometry` diusangkan dalam mendukung dari milik `srid`.

- Metode `get_x()`, `set_x()`, `get_y()`, `set_y()`, `get_z()`, dan `set_z()` dari `Point` diusangkan dalam mendukung dari milik `x`, `y`, dan `z`.

- Metode `get_coords()` dan `set_coords()` dari `Point` diusangkan dalam mendukung dari milik `tuple`.

- `cascaded_union` milik dari `MultiPolygon` diusangkan dalam mendukung dari milik `unary_union`.

- Fungsi `django.contrib.gis.utils.precision_wkt()` diusangkan dalam mendukung dari `WKTWriter`.

### Bidang model `CommaSeparatedIntegerField`

`CommaSeparatedIntegerField` diusangkan dalam mendukung `CharField` dengan pengesah `validate_comma_separated_integer_list()`:

    from django.core.validators import validate_comma_separated_integer_list
    from django.db import models

    class MyModel(models.Model):
        numbers = models.CharField(..., validators=[validate_comma_separated_integer_list])

Jika anda menggunakan Oracle, `CharField` menggunakan jenis bidang basisdata berbeda (`NVARCHAR2`) daripada `CommaSeparatedIntegerField` (`VARCHAR2`). Tergantung pada pengaturan basisdata anda, ini mungkin berarti pengkodean berbeda, dan demikian panjang berbeda (dalam byte) untuk isi sama. Jika anda menyimpan nilai lebih panjang dari batasan 4000 byte dari `NVARCHAR2`, anda harus menggunakan `TextField` (`NCLOB`) sebagai gantinya. Dalam kasus ini, jika anda mempunyai permintaan apapun yang dikelompokkan berdasarkan bidang (sebagai contoh keterangan model dengan kumpulan atau menggunakan `distinct()`) anda akan butuh merubah mereka (untuk menunda bidang).

### Menggunakan sebuah nama model sebagai permintaan pencarian ketika `default_related_name` disetel

Menganggap model berikut:

    from django.db import models

    class Foo(models.Model):
        pass

    class Bar(models.Model):
        foo = models.ForeignKey(Foo)

        class Meta:
            default_related_name = "bars"

In older versions, `default_related_name` couldn't be used as a query lookup. This is fixed and support for the old lookup name is deprecated. For example, since `default_related_name` is set in model `Bar`, instead of using the model name `bar` as the lookup:

    >>> bar = Bar.objects.get(pk=1)
    >>> Foo.objects.get(bar=bar)

use the default_related_name `bars`:

    >>> Foo.objects.get(bars=bar)

### `__search` permintaan pencarian

Pencarian `search`, yang mendukung hanya MySQL dan sangat terbataas dalam fitur, diusangkan. Ganti itu dengan pencarian penyesuaian:

    from django.db import models

    class Search(models.Lookup):
        lookup_name = "search"

        def as_mysql(self, compiler, connection):
            lhs, lhs_params = self.process_lhs(compiler, connection)
            rhs, rhs_params = self.process_rhs(compiler, connection)
            params = lhs_params + rhs_params
            return "MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % (lhs, rhs), params

    models.CharField.register_lookup(Search)
    models.TextField.register_lookup(Search)

### Menggunakan `User.is_authenticated()` dan `User.is_anonymous()` sebagai metode.

Metode `is_authenticated()` dan `is_anonymous()` dari kelas-kelas `AbstractBaseUser` dan `AnonymousUser` sekarang milik. Mereka akan masih bekerja sebagai cara sampai Django 2.0, tetapi semua penggunaan di Django sekarang menggunakan akses atribut.

Sebagai contoh, jika anda menggunakan `AuthenticationMiddleware` dan ingin mengetahui apakah pengguna saat ini masuk anda akan menggunakan:

    if request.user.is_authenticated:
        ...  # Do something for logged-in users.
    else:
        ...  # Do something for anonymous users.

daripada `request.user.is_authenticated()`.

Perubahan ini menghindari kecelakaan kebocoran informasi jika anda lupa memanggil metode, sebagai contoh:

    if request.user.is_authenticated:
        return sensitive_information

Jika anda menimpa metode ini di penyesuaian model pengguna, anda harus merubah mereka menjadi milik atau atribut.

Django menggunakan sebuah obyek `CallableBool` untuk mengizinkan atribut ini bekerja sebagai kedua milik dan metode. Demikian, hingga periode pengusangan berakhir, dan anda tidak dapat membandingkan milik ini menggukan penghubung `is`. Dengan kata lain, berikut tidak akan bekerja:

    if request.user.is_authenticated is True:
        ...

### Kelas-kelas penyesuaian pengelola tersedia melalui `prefetch_related` harus menentukan sebuah metode `_apply_rel_filters()`.

Jika anda menentukan penyesuaian kelas pengelola tersedia melalui `prefetch_related()` anda harus memastikan itu menentukan sebuah metode `_apply_rel_filters()`.

Metode ini harus menerima sebuah instance `QuerySet` sebagai arumen tunggalnya dan mengembalikan versi tersaring dari queryset untuk instance model terikat ke pengelola.

### "escape" setengah dari `django.utils.safestring`

Fungsi `mark_for_escaping()` dan kelas-kelas dia gunakan: `EscapeData`, `EscapeBytes`, `EscapeText`, `EscapeString`, dan `EscapeUnicode` diusangkan.

Sebagai hasil, perilaku "lazy" dari penyaring `escape` (dimana dia akan selalu diberlakukan sebagai penyaring terakhir tidak penting dimana di rantai penyaring dia muncul) diusangkan. Penyaring akan berubah dengan segera memberlakukan `conditional_escape()` di Django 2.0.

### Perubahan `Manager.use_for_related_fields` dan warisan

`Manager.use_for_related_fields` diusangkan dalam mendukung dari pengaturan `Meta.base_manager_name` pada model.

Warisan model `Manager` akan mengikuti aturan warisan MRO di Django 2.0, merubah perilaku saat ini dimana pengelola ditentukan pada kelas-kelas dasar bukan-abstrak tidak diwariskan oleh kelas-kelas anak. Sebuah peringatan pengusangan dengan petunjuk pada bagaimana menyesuaikan kode anda dimunculkan jika anda mempunyai apapun pengelola terpengaruhi. Anda akan antara menyatakan kembali seorang pengelola dari sebuah model abstrak pada kelas anak untuk menimpa pengelola dari model berwujud, atau anda akan menyetel pilihan `Meta.manager_inheritance_from_future=True` model untuk dimasukkan ke perilaku warisan baru.

Selama masa pengusangan, `use_for_related_fields` akan dihormati dan menampilkan sebuah peringatan, bahkan jika sebuah `base_manager_name` disetel. Ini mengizinkan kode pihak-ketiga untuk menjaga perilaku warisan selagi transisi ke API baru. Peringatan dapat didiamkan dengan mengatur `silence_use_for_related_fields_deprecation=True` pada pengelola.

### Bermacam-macam

- Pilihan `makemigrations --exit` diusangkan dalam mendukung dari pilihan `makemigrations --check`.

- `django.utils.functional.allow_lazy()` diusangkan dalam mendukung dari fungsi `keep_lazy()` baru yang dapat digunakan dengan sintaksis penghias alami.

- Pilihan `shell --plain` diusangkan dalam mendukung dari `-i python` atau `--interface python`.

- Mengimpor dari modul `django.core.urlresolvers` diusangkan dalam mendukung dari tempat barunya, `django.urls`.

- Metode `Context.has_key()` cetakan diusangkan dalam mendukung `in`.

- Atribut pribadi `virtual_fields` dari `Model._meta` diusangkan dalam mendukung dari `private_fields`.

- Argumen kata kunci pribadi `virtual_only` di `Field.contribute_to_class()` dan `virtual` di `Model._meta.add_field()` diusangkan dalam mendukung dari `private_only` dan `private`, masing-masing.

- Tampilan `javascript_catalog()` dan `json_catalog()` diusangkan dalam mendukung dari tampilan berdasarkan-kelas `JavaScriptCatalog` dan `JSONCatalog`.

- Di warisan banyak-tabel, promosi tersirat dari `OneToOneField` ke `parent_link` diusangkan. Tambah `parent_link=True` untuk bidang tersebut.

- API pribadi `Widget._format_value()` dibuat umum dan dinamai kembali menjadi `format_value()`. Nama lama akan bekerja sampai masa pengusangan.

- Metode `FileField` pribadi `get_directory_name()` dan `get_filename()` diusangkan dalam mendukung dari penampilan pekerjaan ini di `Storage.generate_filename()`).

- Middleware gaya-lama yang menggunakan `settings.MIDDLEWARE_CLASSES` diusangkan. Adapt old, custom middleware dan menggunakan pengaturan `MIDDLEWARE` baru.

## Fitur-fitur dipindahkan di 1.10

Fitur-fitur ini telah mencapai akhir dari siklus pengusangannya dan dipindahkan di Django 1.10. Lihat Fitur diusangkan di 1.8 untuk rincian, termasuk bagaimana memindahkan penggunaan dari fitur-fitur ini.

- Dukungan untuk memanggil `SQLCompiler` secara langsung sebagai sebuah nama lain untuk memanggil metode `quote_name_unless_alias` nya dipindahkan.

- Etiket cetakan `cycle` dan `firstof` dipindahkan dari pustaka etiket cetakan `future`.

- `django.conf.urls.patterns()` dipindahkan.

- Dukungan untuk argumen `prefix` pada `django.conf.urls.i18n.i18n_patterns()` dipindahkan.

- `SimpleTestCase.urls` dipindahkan.

- Menggunakan perhitungan salah dari nilai dibuka di etiket cetakan `for` memunculkan sebuah pengecualian daripada gagal diam-diam.

- Kemampuan untuk `reverse()` URL menggunakan jalur Python bertitik dipindahkan.

- Kemampuan menggunakan jalur Python bertitik untuk pengaturan `LOGIN_URL` dan `LOGIN_REDIRECT_URL` dipindahkan.

- Dukungan untuk `optparse` dibuang untuk perintah pengelolaan penyesuaian.

- Kelas `django.core.management.NoArgsCommand` dipindahkan.

- Modul `django.core.context_processors` dipindahkan.

- Modul `django.db.models.sql.aggregates` dipindahkan.

- Modul `django.contrib.gis.db.models.sql.aggregates` dipindahkan.

- Metode dan milik berikut dari `django.db.sql.query.Query` dipindahkan:

  - Milik: `aggregates` dan `aggregate_select`

  - Metode: `add_aggregate`, `set_aggregate_mask`, dan `append_aggregate_mask`.

- `django.template.resolve_variable` dipindahkan.

- API pribadi berikut dipindahkan dari `django.db.models.options.Options` (`Model._meta`):

  - `get_field_by_name()`

  - `get_all_field_names()`

  - `get_fields_with_model()`

  - `get_concrete_fields_with_model()`

  - `get_m2m_with_model()`

  - `get_all_related_objects()`

  - `get_all_related_objects_with_model()`

  - `get_all_related_many_to_many_objects()`

  - `get_all_related_m2m_objects_with_model()`

- Argumen `error_message` dari `django.forms.RegexField` dipindahkan.

- Penyaring `unordered_list` tidak mendukung lagi daftar gaya lama.

- Dukungan untuk deretan karakter argumen `view` pada `url()` dipindahkan.

- Shim kesesuaian kebelakang untuk menamai kembali `django.forms.Form._has_changed()` pada `has_changed()` dipindahkan.

- Penyaring cetakan `removetags` dipindahkan.

- Fungsi `remove_tags()` dan `strip_entities()` di `django.utils.html` dipindahkan.

- Argumen `is_admin_site` pada `django.contrib.auth.views.password_reset()` dipindahkan.

- `django.db.models.field.subclassing.SubfieldBase` dipindahkan.

- `django.utils.checksums` dipindahkan.

- Atribut `original_content_type_id` pada `django.contrib.admin.helpers.InlineAdminForm` dipindahkan.

- Shim kesesuaian kebelakang mengizinkan `FormMixin.get_form()` untuk ditentukan dengan nilai tidak ada awalan untuk argumen `form_class` nya dipindahkan.

- Pengaturan berikut telah dihapus, anda harus ubah menjadi pengaturan `TEMPLATES`:

  - `ALLOWED_INCLUDE_ROOTS`

  - `TEMPLATE_CONTEXT_PROCESSORS`

  - `TEMPLATE_DEBUG`

  - `TEMPLATE_DIRS`

  - `TEMPLATE_LOADERS`

  - `TEMPLATE_STRING_IF_INVALID`

- Nama lain kesesuaian kebelakang `django.template.loader.BaseLoader` dipindahkan.

- Django template objects returned by `get_template()` and `select_template()` no longer accept a `Context` in their `render()` method.

- Template response APIs memaksa penggunaan dari `dict` dan obyek cetakan tergantung-backend daripada masing-masing `Context` dan `Template`.

- Parameter `current_app` untuk fungsi dan kelas-kelas berikut dipindahkan:

  - `django.shortcuts.render()`

  - `django.template.Context()`

  - `django.template.RequestContext()`

  - `django.template.response.TemplateResponse()`

- Parameter `dictionary` dan `context_instance` untuk fungsi berikut dipindahkan:

  - `django.shortcuts.render()`

  - `django.shortcuts.render_to_response()`

  - `django.template.loader.render_to_string()`

- Parameter `dirs` untuk fungsi berikut dipindahkan:

  - `django.template.loader.get_template()`

  - `django.template.loader.select_template()`

  - `django.shortcuts.render()`

  - `django.shortcuts.render_to_response()`

- Pengecekan sesi diadakan tanpa memperhatikan apakah atau tidak `'django.contrib.auth.middleware.SessionAuthenticationMiddleware'` di `MIDDLEWARE_CLASSES`. `SessionAuthenticationMiddleware` tidak lagi mempunyai tujuan apapun dan dapat dipindahkan dari `MIDDLEWARE_CLASSES`. Itu dijaga sebagai potongan sampai Django 2.0 sebagai basa-basi untuk pengguna yang tidak membaca catatan ini.

- Atribut pribadi `django.db.models.Field.related` dipindahkan.

- Pilihan `--list` dari perintah pengelolaan `migrate` dipindahkan.

- Etiket cetakan `ssi` dipindahkan.

- Mendukung untuk penghubung perbandingan `=` di etiket cetakan `if` dipindahkan.

- Shim kesesuaian kebelakang mengizinkan `Storage.get_available_name()` dan `Storage.save()` untuk ditentukan tanpa sebuah argumen `max_length` dipindahkan.

- Dukungan untuk warisan sintaksis `%(<foo>)s` di `ModelFormMixin.success_url` dipindahkan.

- `GeoQuerySet` kumpulan metode `collect()`, `extent()`, `extent3d()`, `make_line()`, dan `unionagg()` dipindahkan.

- Kemampuan untuk menentukan `ContentType.name` ketika membuat instance jenis isi dipindahkan.

- Dukungan untuk tandatangan lama dari `allow_migrate` dipindahkan.

- Dukungan untuk sintaksis `{% cycle %}` yang menggunakan argumen dipisah-koma dipindahkan.

- Peringatan yang `Signer` muncul ketika pemisah tidak sah yang diberikan sekarang menjadi sebuah pengecualian.