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

> **Note**
>
> Dipersembahkan kepada Malcolm Tredinnick
>
> Pada 17 Maret 2013, proyek Django dan komunitas perangkat lunak bebas kehilangan teman dan pengembang.
>
> Malcom adalah pembantu lama pada Django, sebuah model anggota komunitas, pikiran cemerlang, dan seorang teman. Bantuannya pada Django - dan ke banyak proyek sumber terbuka lainnya - hampir tidak mungkin menghitung. Banyak pada tim Django inti mempunyai tambalan pertama mereka ditinjau oleh dia; bimbingannya memperkaya kami. Pertimbangan dia, kesabaran, dan pengabdian akan selalu menjadi inspirasi untuk kami.
>
> Terbitan Django ini untuk Malcolm.
>
> -- Pengembang Django

*November 6, 2013*

Selamat datang di Django 1.6!

Catatan terbitan ini mencangkupi [new features](#whats-new-1-6), sama halnya beberapa [backwards incompatible changes](#backwards-incompatible-1-6) anda akan ingin menjadi waspada ketika meningkatkan dari Django 1.5 atau versi terlama. Kami telah membuang beberapa fitur, yang rinciannya di [our deprecation plan](/id/5.2/internals/deprecation/#deprecation-removed-in-1-6), dan kami telah [begun the deprecation process for some features](#deprecated-features-1-6).

## Kesesuaian Python

Django 1.6, seperti Django 1.5, membutuhkan Python 2.6.5 atau diatasnya. Python 3 juga secara resmi didukung. Kami **sangat menganjurkan** terbitan kecil terakhir untuk setiap rangkaian Python yang didukung (2.6.X, 2.7.X, 3.2.X, and 3.3.X).

Django 1.6 akan menjadi rangkaian terbitan terakhir untuk mendukung Python 2.6; dimulai dengan Django 1.7, minimal dukungan versi Python akan menjadi 2.7.

Python 3.4 tidak didukung, tetapi dukungan akan ditambahkan di Django 1.7.

## Apa yang baru di Django 1.6

### Sederhanakan proyek awal dan cetakan aplikasi

Cetakan awalan digunakan oleh [`startproject`](/id/5.2/ref/django-admin/#django-admin-startproject) dan [`startapp`](/id/5.2/ref/django-admin/#django-admin-startapp) telah disederhanakan dan dimodernisasikan. [admin](/id/5.2/ref/contrib/admin/) sekarng diadakan secara awalan di proyek baru; kerangka kerja [sites](/id/5.2/ref/contrib/sites/) tidak lagi. [clickjacking prevention](/id/5.2/ref/clickjacking/#clickjacking-prevention) sekarang di dan awalan basisdata pada SQLite.

Jika awalan cetakan tidak cocok dengan rasa anda, anda dapat menggunakan [custom project and app templates](/id/5.2/ref/django-admin/#custom-app-and-project-templates).

### Perbaikan pengelolaan transaksi

Pengelolaan transaksi Django dirombak. Tingkat-basisdata pembenaran otomatis sekarang nyala sebagai awalan. Ini membuat penanganan transaksi lebih jelas dan harus meningkatkan penampilan. API yang ada diusangkan, dan API baru telah diperkenalkan, sebagai digambarkan di [transaction management docs](/id/5.2/topics/db/transactions/).

### Hubungan basisdata gigih

Django now supports reusing the same database connection for several requests.
This avoids the overhead of reestablishing a connection at the beginning of
each request. For backwards compatibility, this feature is disabled by
default. See [Hubungan tetap](/id/5.2/ref/databases/#persistent-database-connections) for details.

### Penemuan percobaan di tiap modul percobaan

Django 1.6 dibekali dengan pejalan percobaan baru yang mengizinkan lebih keluwesan di tempat dari percobaan. Pejalan sebelumnya (`django.test.simple.DjangoTestSuiteRunner`) menemukan percobaan hanya di modul `models.py` dan `tests.py` dari paket Python di [`INSTALLED_APPS`](/id/5.2/ref/settings/#std-setting-INSTALLED_APPS).

Pejalan baru (`django.test.runner.DiscoverRunner`) menggunakan fitur penemuan percobaan dibangun kedalam `unittest2` (versi dari `unittest` di pustaka standar  Python 2.7+, dan digabung dengan Django). Dengan penemuan percobaan, percobaan dapat ditempatkan di tiap modul yang namanya cocok dengan pola `test*.py`.

Sebagai tambahan, label percobaan disediakan pada `./manage.py test` untuk menunjuk percobaan khusus untuk berjalan harus sekarang menjadi jalur bertitik Python penuh (atau jalur direktori), daripada halur-semu `applabel.TestCase.test_method_name`. Ini mengizinkan menjalankan percobaan ditempatkan dimana saja di basis kode anda, daripada hanya di [`INSTALLED_APPS`](/id/5.2/ref/settings/#std-setting-INSTALLED_APPS). Untuk rincian lebih, lihat [Percobaan di Django](/id/5.2/topics/testing/).

Perubahan ini adalah kesesuaian-kebelakang; lihat [backwards-incompatibility notes](#new-test-runner).

### Mengetahui pengumpulan zona waktu

Dukungan untuk [time zones](/id/5.2/topics/i18n/timezones/) diperkenalkan di DJango 1.4 tidak bekerja baik dengan [`QuerySet.dates()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.dates): pengumpulan selalu dilakukan di UTC. Batasan ini telah diangkat di Django 1.6. Gunakan ``QuerySet.datetimes() <django.db.models.query.QuerySet.datetimes>`untuk melakukan mengetahui pengumpulan zona waktu di  :class:`~django.db.models.DateTimeField()``.

### Dukungan untuk savepoint di SQLite

Django 1.6 menambahkan dukungan untuk savepoint di SQLite, dengan beberapa [limitations](/id/5.2/topics/db/transactions/#savepoints-in-sqlite).

### Bidang model `BinaryField`

Bidang model [`django.db.models.BinaryField`](/id/5.2/ref/models/fields/#django.db.models.BinaryField) baru mengizinkan penyimpanan dari data biner mentah di basisdata.

### GeoDjango dari widget

GeoDjango sekarang menyediakan [form fields and widgets](/id/5.2/ref/contrib/gis/forms-api/) untuk bidang khusus-geo nya. Mereka adalah berdasarkan-OpenLayer secara awalan, tetapi mereka dapat disesuaiakan untuk menggunakan apapun kerangka kerja JS lain.

### Perintah pengelolaan `check` ditambahkan untuk mengecek kesesuaian

Sebuah perintah pengelolaan [`check`](/id/5.2/ref/django-admin/#django-admin-check) telah ditambahkan, mengadakan anda untuk memeriksa jika konfigurasi anda saat ini (saat ini bertujuan pada pengaturan) adalah cocok dengan versi saat ini dari Django.

### Algoritma [`Model.save()`](/id/5.2/ref/models/instances/#django.db.models.Model.save) berubah

Metode [`Model.save()`](/id/5.2/ref/models/instances/#django.db.models.Model.save) sekarang mencoba secara langsung `UPDATE` basisdata jika instance mempunyai sebuah nilai primary key. Sebelumnya `SELECT` telah dilakukan untuk menentukan jika `UPDATE` atau `INSERT` dibutuhkan. Algoritma baru dibutuhkan jika hanya satu permintaan untuk memperbaharui baris yang ada selagi algoritma lama membutuhkan dua. Lihat [`Model.save()`](/id/5.2/ref/models/instances/#django.db.models.Model.save) untuk lebih rinci.

Di beberapa kasus yang jarang basisdata tidak melaporkan bahwa sebuah baris yang cocok telah ditemukan ketika melakukan sebuah `UPDATE`. Sebuah contoh adalah pemicu `ON UPDATE` PostgreSQL yang mengembalikan `NULL`. Dalam kasus tersebut itu memungkinkan menyetel bendera [`django.db.models.Options.select_on_save`](/id/5.2/ref/models/options/#django.db.models.Options.select_on_save) untuk memaksa menyimpan menggunakan algoritma lama.

### Fitur kecil

- Backend otentifikasi dapat memunculkan `PermissionDenied` untuk segera menggagalkan rantai otentifikasi.
- Bendera `HttpOnly` dapat disetel di kue CSRF dengan [`CSRF_COOKIE_HTTPONLY`](/id/5.2/ref/settings/#std-setting-CSRF_COOKIE_HTTPONLY).
- The `assertQuerysetEqual()` now checks
  for undefined order and raises [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError) if undefined
  order is spotted. The order is seen as undefined if the given `QuerySet`
  isn't ordered and there is more than one ordered value to compare against.
- Ditambahkan [`earliest()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.earliest) untuk simetri dengan [`latest()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.latest).
- Sebagai tambahan pada [`year`](/id/5.2/ref/models/querysets/#std-fieldlookup-year), [`month`](/id/5.2/ref/models/querysets/#std-fieldlookup-month) dan [`day`](/id/5.2/ref/models/querysets/#std-fieldlookup-day), ORM sekarang mendukung pencarian [`hour`](/id/5.2/ref/models/querysets/#std-fieldlookup-hour), [`minute`](/id/5.2/ref/models/querysets/#std-fieldlookup-minute) dan [`second`](/id/5.2/ref/models/querysets/#std-fieldlookup-second).
- Django sekarang membungkus semua pengecualian [**PEP 249**](https://peps.python.org/pep-0249/).
- Widget awalan untuk [`EmailField`](/id/5.2/ref/forms/fields/#django.forms.EmailField), [`URLField`](/id/5.2/ref/forms/fields/#django.forms.URLField), [`IntegerField`](/id/5.2/ref/forms/fields/#django.forms.IntegerField), [`FloatField`](/id/5.2/ref/forms/fields/#django.forms.FloatField) dan [`DecimalField`](/id/5.2/ref/forms/fields/#django.forms.DecimalField) menggunakan atribut jenis baru tersedia di HTML5 (`type='email'`, `type='url'`, `type='number'`). Catat bagwa karena dukungan tak menentu dari jenis masukan `number` dengan angka lokal di peramban saat ini, Django hanya menggunakannya ketika bidang numerik tidak di lokalkan.
- Argumen `number` untuk [lazy plural translations](/id/5.2/topics/i18n/translation/#lazy-plural-translations) dapat disediakan pada waktu terjemahan daripada saat waktu penentuan.
- For custom management commands: Verification of the presence of valid
  settings in commands that ask for it by using the
  `BaseCommand.can_import_settings` internal
  option is now performed independently from handling of the locale that
  should be active during the execution of the command. The latter can now be
  influenced by the new
  `BaseCommand.leave_locale_alone` internal
  option. See [Pengelolaan perintah dan lokal](/id/5.2/howto/custom-management-commands/#management-commands-and-locales) for more details.
- [`success_url`](/id/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.DeletionMixin.success_url) dari [`DeletionMixin`](/id/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.DeletionMixin) sekarang ditambahkan dengan `__dict__` `object` nya.
- [`HttpResponseRedirect`](/id/5.2/ref/request-response/#django.http.HttpResponseRedirect) dan [`HttpResponsePermanentRedirect`](/id/5.2/ref/request-response/#django.http.HttpResponsePermanentRedirect) sekarang menyediakan sebuah atribut `url` (setara dengan tanggapan URL akan dialihkan).
- Backend penyimpanan sementara `MemcachedCache` sekarang menggunakan protokol [`pickle`](https://docs.python.org/3/library/pickle.html#module-pickle) yang terakhir tersedia.
- Ditambahkan [`SuccessMessageMixin`](/id/5.2/ref/contrib/messages/#django.contrib.messages.views.SuccessMessageMixin) yang menyediakan sebuah atribut `success_message` untuk [`FormView`](/id/5.2/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView) berdasarkan kelas-kelas.
- Ditambahkan pilihan [`django.db.models.ForeignKey.db_constraint`](/id/5.2/ref/models/fields/#django.db.models.ForeignKey.db_constraint) dan [`django.db.models.ManyToManyField.db_constraint`](/id/5.2/ref/models/fields/#django.db.models.ManyToManyField.db_constraint).
- Pustaka jQuery ditanam di admin telah ditingkatkan ke versi 1.9.1.
- Umpan kongsi ([`django.contrib.syndication`](/id/5.2/ref/contrib/syndication/#module-django.contrib.syndication)) sekarang dapat melewatkan konteks tambahan melalui cetakan umpan menggunakan callback [`Feed.get_context_data()`](/id/5.2/ref/contrib/syndication/#django.contrib.syndication.Feed.get_context_data) baru.
- Kolom daftar admin mempunyai sebuah kelas `column-<field_name>` di HTML jadi kepalakolom dapat digaya dengan CSS, sebagai contoh untuk menyetel lebar kolom.
- [isolation level](/id/5.2/ref/databases/#database-isolation-level) dapat disesuaikan dibawah PostgreSQL.
- Etiket cetakan [`blocktrans`](/id/5.2/topics/i18n/translation/#std-templatetag-blocktrans) sekarang mematuhi `TEMPLATE_STRING_IF_INVALID` untuk variabel tidak hadir di konteks, sama seprti penyusunan cetakan lain.
- `SimpleLazyObject` sekarang akan menghadirkan gambaran lebih membantu dalam keadaan mencari kesalahan shell.
- Generic [`GeometryField`](/id/5.2/ref/contrib/gis/model-api/#django.contrib.gis.db.models.GeometryField) is now editable
  with the OpenLayers widget in the admin.
- Dokumentasi mengandung [deployment checklist](/id/5.2/howto/deployment/checklist/).
- Perintah [`diffsettings`](/id/5.2/ref/django-admin/#django-admin-diffsettings) mendapatkan pilihan `--all`.
- `django.forms.fields.Field.__init__` sekarang memanggil `super()`, mengizinkan campuran bidang untuk menerapkan metode `__init__()` yang akan dapat dihandalkan dipanggil.
- Parameter `validate_max` telah ditambahkan ke `BaseFormSet` dan [`formset_factory()`](/id/5.2/ref/forms/formsets/#django.forms.formsets.formset_factory), dan `ModelForm` dan versi berderet dari yang sama. Perilaku dari pengesahan untuk formset dengan `max_num` telah dijelaskan. Sebelumnya perilaku tidak terdokumentasi yang mengeraskan formset terhadap serangan kelelahan ingatan telah didokumentasikan, dan tidak terdokumentasi terbatas dari lebih tinggi 1000 atau `max_num` formulir telah dirubah jadi itu selalu 1000 lebih daripada `max_num`.
- Ditambahkan `BCryptSHA256PasswordHasher` untuk menyelesaikan masalah pemotongan sandi dengan bcrypt.
- [Pillow](https://pypi.org/project/Pillow/) is now the preferred image manipulation library to use with
  Django. [PIL](https://pypi.org/project/PIL/) is pending deprecation (support to be removed in Django
  1.8). To upgrade, you should **first** uninstall PIL, **then** install
  Pillow.
- [`ModelForm`](/id/5.2/topics/forms/modelforms/#django.forms.ModelForm) menerima beberapa pilihan `Meta` baru.

  - Bidang-bidang disertakan dalam daftar `localized_fields` akan dilokalkan (dengan menyetel `localize` pada bidang formulir).
  - Pilihan `labels`, `help_texts` dan `error_messages` mungkin digunakan untuk menyesuaikan bidang awalan, lihat [Mengesampingan nilai awal](/id/5.2/topics/forms/modelforms/#modelforms-overriding-default-fields) untuk rincian.
- Argumen `choices` pada bidang model sekarang menerima sebuah perulangan dari perulangan sebagai gantinya membutuhkan sebuah perulangan dari daftar atau tuple.
- Alasan frase dapat disesuaikan di tanggapan HTTP menggunakan [`reason_phrase`](/id/5.2/ref/request-response/#django.http.HttpResponse.reason_phrase).
- When giving the URL of the next page for
  `django.contrib.auth.views.logout()`,
  `django.contrib.auth.views.password_reset()`,
  `django.contrib.auth.views.password_reset_confirm()`,
  and `django.contrib.auth.views.password_change()`, you can now pass
  URL names and they will be resolved.
- Pilihan [`dumpdata --pks`](/id/5.2/ref/django-admin/#cmdoption-dumpdata-pks) baru menentukan primary key dari obyek untuk membuang. Pilihan ini dapat hanya digunakan dengan satu model.
- Ditambahkan metode `QuerySet` [`first()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.first) dan [`last()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.last) yang metode kenyamanan mengembalikan obyek pertama atau terakhir mencocokkan saringan. Mengembalikan `None` jika tidak ada pencocokan obyek.
- [`View`](/id/5.2/ref/class-based-views/base/#django.views.generic.base.View) dan [`RedirectView`](/id/5.2/ref/class-based-views/base/#django.views.generic.base.RedirectView) sekarang mendukung metode HTTP `PATCH`.
- `GenericForeignKey` sekarang mengambil sebuah pilihan argumen `for_concrete_model`, yang ketika disetel ke `False` mengizinkan bidang untuk mengacu model proxy. Awalan adalah `True` untuk memelihara perilaku lama.
- [`LocaleMiddleware`](/id/5.2/ref/middleware/#django.middleware.locale.LocaleMiddleware) sekarang menyimpan bahasa aktif di sesi jika itu tidak hadir disana. Ini mencegah kehilangan dari pengaturan bahasa setelah menyiram sesi, sebagai contoh keluar.
- [`SuspiciousOperation`](/id/5.2/ref/exceptions/#django.core.exceptions.SuspiciousOperation) telah dibedakan menjadi sejumlah subkelas, dan setiap akan masuk untuk mencocokan pencatat bernama dibawah hirarki pencatatan `django.security`. Bersama dengan perubahan ini, sebuah mekanisme `handler400` dan tampilan awal digunakan ketika kapanpun `SuspiciousOperation` mencapai penangan WSGI untuk mengembalikan sebuah `HttpResponseBadRequest`.
- Pengecualian [`DoesNotExist`](/id/5.2/ref/models/class/#django.db.models.Model.DoesNotExist) sekarang menyertakan sebuah pesan yang menunjukkan nama dari atribut digunakan untuk pencarian.
- Metode [`get_or_create()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create) tidak lagi membutuhkan setidaknya satu argumen katakunci.
- The [`SimpleTestCase`](/id/5.2/topics/testing/tools/#django.test.SimpleTestCase) class includes a new assertion
  helper for testing formset errors:
  `django.test.SimpleTestCase.assertFormsetError()`.
- Daftar dari bidang-bidang terkait ditambahkan pada [`QuerySet`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet) oleh [`select_related()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.select_related) dapat dibersihkan menggunakan `select_related(None)`.
- Metode [`get_extra()`](/id/5.2/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.get_extra) dan [`get_max_num()`](/id/5.2/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.get_max_num) pada [`InlineModelAdmin`](/id/5.2/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin) mungkin dikesampingkan untuk menyesuaikan jumlah tambahan dan maksimal dari formulir berderet.
- Formset sekarang mempunyai sebuah metode [`total_error_count()`](/id/5.2/topics/forms/formsets/#django.forms.formsets.BaseFormSet.total_error_count).
- Bidang-bidang [`ModelForm`](/id/5.2/topics/forms/modelforms/#django.forms.ModelForm) sekarang dapat menimpa pesan-pesan kesalahan ditentukan di bidang model dengan menggunakan argumen [`error_messages`](/id/5.2/ref/forms/fields/#django.forms.Field.error_messages) dari pembangun `Field`. Untuk mengambil kesimpulan dari fitur ini dengan bidang penyesuaian anda, [see the updated recommendation](/id/5.2/ref/forms/validation/#raising-validation-error) untuk memunculkan `ValidationError`.
- [`ModelAdmin`](/id/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin) sekarang mempertahankan penyaring pada daftar tampilan setelah membuat, menyunting atau menghapus sebuah obyek. Itu memungkinkan menyimpan kembali perilaku sebelumnya dari membersihkan penyaring dengan mengatur atribut [`preserve_filters`](/id/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.preserve_filters) menjadi `False`.
- Ditambahkan [`FormMixin.get_prefix`](/id/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.get_prefix) (yang mengembalikan [`FormMixin.prefix`](/id/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.prefix) secara awalan) untuk mengizinkan menyesuaikan [`prefix`](/id/5.2/ref/forms/api/#django.forms.Form.prefix) dari formulir.
- Permintaan mentah (`Manager.raw()` atau `cursor.execute()`) sekarang dapat menggunakan gaya parameter "pyformat", dimana placeholder dalam permintaan diberikan sebagai `'%(name)s'` dan parameter dilewatkan sebagai sebuah kamus daripada sebuah daftar (kecuali di SQLite). Ini telam lama mungkin (tetapi bukan secara resmi didukung) di MySQL dan PostgreSQL, dan sekarang juga tersedia di Oracle.
- Perhitungan putaran awal untuk pengacak sandi PBKDF2 telah ditingkatkan oleh 20%. Perubahan kesesuaian kebelakang tidak akan mempengaruhi sandi atau pengguna yang mempunyai disubkelaskan `django.contrib.auth.hashers.PBKDF2PasswordHasher` untuk merubah nilai awal. Sandi [will be upgraded](/id/5.2/topics/auth/passwords/#password-upgrades) untuk menggunakan perhitungan putaran baru sesuai kebutuhan.

## Perubahan bertentangan kebelakang di 1.6

> **Warning**
>
> Sebagai tambahan pada perubahan diuraikan di bagian ini, pastikan untuk meninjau kembali [deprecation plan](/id/5.2/internals/deprecation/#deprecation-removed-in-1-6) untuk setiap fitur yang telah dipindahkan. Jika anda belum memperbaharui kode anda dalam linimasa pengusangan untuk fitur yang diberikan, perpindahannya mugkin muncul sebagai perubahan ketidaksesuaian kebelakang.

### Model pengelolaan transaksi baru

#### Perubahan perilaku

Pembenaran otomatis tingkat-basisdata diadakan secara awalan di Django 1.6. Selagi ini tidak merubah jiwa umum dari pengelolaan transaksi Django, ada sedikit ketidaksesuaian-kebelakang.

#### Savepoints dan `assertNumQueries`

Perubahan di pengelolaan transaksi dapat menghasilkan di pernyataan tambahan untuk membuat, menerbitkan atau menyimpan kembali titik penyimpanan sampai terbitan ini.

Jika percobaan menggunakan [`assertNumQueries()`](/id/5.2/topics/testing/tools/#django.test.TransactionTestCase.assertNumQueries) gagal karena dari angka tertinggi dari permintaan daripada diharapkan, periksa bahwa permintaan tambahan dikaitkan ke titik penyimpanan, dan menyesuaikan angka yang diharapkan dari permintaan sesuai dengan itu.

#### Pilihan perbaikan otomatis untuk PostgreSQL

Di versi sebelumnya, perbaikan otomatis tingkatan-basisdata hanya sebuah pilihan untuk PostgreSQL, dan itu ditiadakan secara awalan. Pilihan ini sekarang diabaikan dan dapat dipindah.

### Pejalan percobaan baru

In order to maintain greater consistency with Python's `unittest` module, the
new test runner (`django.test.runner.DiscoverRunner`) does not automatically
support some types of tests that were supported by the previous runner:

- Percobaan di berkas `models.py` dan `tests/__init__.py` tidak lagi ditemukan dan berjalan. Pindahkan mereka ke sebuah berkas yang namanya dimulai dengan `test`.
- Doctest tidak akan lagi secara otomatis ditemukan. Untuk memadukan doctest ke deretan percobaan anda, ikuti [recommendations in the Python documentation](https://docs.python.org/3/library/doctest.html#doctest-unittest-api).

Django bundles a modified version of the [`doctest`](https://docs.python.org/3/library/doctest.html#module-doctest) module from the Python
standard library (in `django.test._doctest`) and includes some additional
doctest utilities. These utilities are deprecated and will be removed in Django
1.8; doctest suites should be updated to work with the standard library's
doctest module (or converted to `unittest`-compatible tests).

Jika anda berharap menunda perbaharuan ke deretan percobaan anda, anda dapat menyetel pengaturan [`TEST_RUNNER`](/id/5.2/ref/settings/#std-setting-TEST_RUNNER) anda menjadi `django.test.simple.DjangoTestSuiteRunner` untuk sepenuhnya menyimpan kembali perilaku percobaan lama. `DjangoTestSuiteRunner` diusangkan tetapi tidak akan dipindahkan dari Django sampai versi 1.8.

### Perpindahan dari pejalan percobaan penyesuaian GeoDjango `django.contrib.gis.tests.GeoDjangoTestSuiteRunner`

Ini adalah untuk pengembang yang bekerja pada aplikasi GeoDjango itu sendiri dan terkait ke barang diatas tentang perubahan di penjalan percobaan:

Penjalan percobaan `django.contrib.gis.tests.GeoDjangoTestSuiteRunner` telah dipindahkan dan setelan pengerjaan percobaan GeoDajngo berdiri sendiri  itu terapkan tidak didukung lagi. Untuk menjalankan percobaan GeoDjango cukup gunakan `DiscoverRunner` baru dan tentukan aplikasi `django.contrib.gis`.

### Menyesuaikan model user di percobaan

Perkenalan dari pejalan percobaan baru juga sedikit merubah cara dimana model percobaan diimpor. Sebagai hasilnya, percobaan apapun yang menimpa `AUTH_USER_MODEL` untuk mencoba perilaku dengan satu dari model pengguna percobaan Dajngo ( `django.contrib.auth.tests.custom_user.CustomUser` dan `django.contrib.auth.tests.custom_user.ExtensionUser`) harus sekarang secara eksplisit impor model User di modul percobaan anda:

```
from django.contrib.auth.tests.custom_user import CustomUser

@override_settings(AUTH_USER_MODEL="auth.CustomUser")
class CustomUserFeatureTests(TestCase):
    def test_something(self):
        # Test code here
        ...
```

This import forces the custom user model to be registered. Without this import,
the test will be unable to swap in the custom user model, and you will get an
error reporting:

```pytb
ImproperlyConfigured: AUTH_USER_MODEL refers to model 'auth.CustomUser' that has not been installed
```

### Sadar-zona waktu pencarian `day`, `month`, dan `week_day`

Django 1.6 memperkenalkan dukungan zona waktu untuk pencarian [`day`](/id/5.2/ref/models/querysets/#std-fieldlookup-day), [`month`](/id/5.2/ref/models/querysets/#std-fieldlookup-month), dan [`week_day`](/id/5.2/ref/models/querysets/#std-fieldlookup-week_day) ketika [`USE_TZ`](/id/5.2/ref/settings/#std-setting-USE_TZ) adalah `True`. Pencarian ini sebelumnya dilakukan di UTC tanpa memperhatikan dari zona waktu sekarang.

Ini membutuhkan [time zone definitions in the database](/id/5.2/ref/models/querysets/#database-time-zone-definitions). Jika anda sedang menggunakan SQLite, anda harus memasang [pytz](http://pytz.sourceforge.net/). Jika anda sedang menggunakan MySQL, anda harus memasang [pytz](http://pytz.sourceforge.net/) dan memuat tabel zona waktu dengan [mysql\_tzinfo\_to\_sql](https://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html).

### Tambahan dari `QuerySet.datetimes()`

Ketika [time zone support](/id/5.2/topics/i18n/timezones/) ditambahkan di Django 1.4 telah aktif, pencarian [`QuerySet.dates()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.dates) mengembalikan hasil tidak diharapkan, karena pengumpulan telah dilakukan dalam UTC. Untuk memperbaiki ini, Django 1.6 memperkenalkan API baru, [`QuerySet.datetimes()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.datetimes). Ini membutuhkan sedikit perubahan di kode anda.

#### `QuerySet.dates()` mengembalikan obyek `date`

[`QuerySet.dates()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.dates) sekarang mengemblikan sebuah daftar dari [`date`](https://docs.python.org/3/library/datetime.html#datetime.date). Itu digunakan untuk mengembalikan sebuah daftar [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime).

[`QuerySet.datetimes()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.datetimes) mengembalikan sebuah daftar dari [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime).

#### `QuerySet.dates()` tidak lagi digunakan pada `DateTimeField`

[`QuerySet.dates()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.dates) memunculkan sebuah kesalahan jika itu digunakan di [`DateTimeField`](/id/5.2/ref/models/fields/#django.db.models.DateTimeField) ketika dukungan zona waktu aktif. Gunakan [`QuerySet.datetimes()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.datetimes) sebagai gantinya.

#### `date_hierarchy` membutuhkan penentuan zona waktu

Fitur [`date_hierarchy`](/id/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.date_hierarchy) dari admin sekarang bergantung pada [`QuerySet.datetimes()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.datetimes) ketika itu digunakan di [`DateTimeField`](/id/5.2/ref/models/fields/#django.db.models.DateTimeField).

Ini membutuhkan penentuan zona waktu di basisdata ketika [`USE_TZ`](/id/5.2/ref/settings/#std-setting-USE_TZ) adalah `True`. [Learn more](/id/5.2/ref/models/querysets/#database-time-zone-definitions).

#### `date_list` dalam tampilan umum membutuhkan penentuan zona waktu

Untuk alasan sama, mengakses `date_list` di konteks dari tampilan umum berdasarkan-tanggal membutuhkan penentuan zona waktu di basisdata ketika tampilan berdasarkan pada [`DateTimeField`](/id/5.2/ref/models/fields/#django.db.models.DateTimeField) dan [`USE_TZ`](/id/5.2/ref/settings/#std-setting-USE_TZ) adalah `True`. [Learn more](/id/5.2/ref/models/querysets/#database-time-zone-definitions).

### Pencarian baru mungkin bertabrakan dengan bidang-bidang model

Django 1.6 memperkenalkan pencarian `hour`, `minute`, dan `second` di [`DateTimeField`](/id/5.2/ref/models/fields/#django.db.models.DateTimeField). Jika anda mempunyai bidang model dipanggil `hour`, `minute`, atau `second`, pencarian baru akan bentrok dengan nama bidang anda. Tambahkan sebuah pencarian [`exact`](/id/5.2/ref/models/querysets/#std-fieldlookup-exact) jelas jika ini adalah sebuah masalah.

### `BooleanField` tidak lagi disetel ke `False`

Ketika sebuah [`BooleanField`](/id/5.2/ref/models/fields/#django.db.models.BooleanField) tidak mempunyai [`default`](/id/5.2/ref/models/fields/#django.db.models.Field.default) jelas, nilai awalan tersirat adalah `None`. Dalam versi sebelumnya dari Django, itu adalah `False`, tetapi itu tidak mewakili secara akurat kekurangan dari sebuah nilai.

Kode yang bergantung pada nilai awalan menjadi `False` mungkin memunculkan sebuah pengecualian ketika menyimpan instance model baru ke basisdata, karena `None` bukan sebuah nilai yang dapat diterima untuk sebuah [`BooleanField`](/id/5.2/ref/models/fields/#django.db.models.BooleanField). Anda harus juga menentukan `default=False` di penentuan bidang, atau memastikan bidang disetel ke `True` atau `False` sebelum menyimpan obyek.

### Terjemahan dan komentar dalam cetakan

#### Pengeluaran dari terjemahan setelah komentar

Pengeluaran dari harfiah dapat diterjemahkan dari cetakan dengan perintah [`makemessages`](/id/5.2/ref/django-admin/#django-admin-makemessages) sekarang dengan benar mengenali gagasan i18n ketika mereka ditempatkan setelah sebuah `{#` / `#}`\- ketik komentar di baris sama. Sebagai contoh:

```html+django
{# A comment #}{% trans "This literal was incorrectly ignored. Not anymore" %}
```

#### Tempat untuk komentar penterjemah

[Komentar untuk penterjemah dalam cetakan](/id/5.2/topics/i18n/translation/#translator-comments-in-templates) ditentukan menggunakan `{#` / `#}` harus pada akhir dari sebuah baris. Jika mereka tidak, komentar diabaikan dan [`makemessages`](/id/5.2/ref/django-admin/#django-admin-makemessages) akan membangkitkan sebuah peringatan. Sebagai contoh:

```html+django
{# Translators: This is ignored #}{% trans "Translate me" %}
{{ title }}{# Translators: Extracted and associated with 'Welcome' below #}
<h1>{% trans "Welcome" %}</h1>
```

### Mengutip dalam `reverse()`

Ketika membalikkan URL, Django tidak memberlakukan `django.utils.http.urlquote` pada argumen-argumen sebelum menyisipkan mereka dalam pola URL. Kesalahan ini diperbaiki di Django 1.6. Jika anda bekerja disekitar kesalahan ini dengan memberlakukan kutipan URL sebelum melewatkan argumen pada `reverse()`, ini mungkin menghasilkan kutipan-ganda. Jika ini terjadi, cukup pindahkan kutipan URL dari kode anda. Ini akan juga mengganti karakter khusus dalam URL digunakan dalam [`assertRedirects()`](/id/5.2/topics/testing/tools/#django.test.SimpleTestCase.assertRedirects) dengan versi tersandikan mereka.

### Penyimpanan dari alamat IP dalam aplikasi komentar

Aplikasi komentar sekarang menggunakan sebuah `GenericIPAddressField` untuk menyimpan alamat IP komentar, untuk mendukung komentar diajukan dari alamat IPv6. Sampai sekarang, itu menyimpan mereka di sebuah `IPAddressField`, yang hanya berarti mendukung IPv4. Ketika menyimpan sebuah komentar yang dibuat dari alamat IPv6, alamat akan secara diam dipotong di basisdata MySQL, dan memunculkan sebuah pengecualian di Oracle. Anda akan butuh merubah jenis kolom di basisdata anda untuk mengambil keuntungan dari perubahan ini.

Untuk MySQL, jalankan permintaan ini di basisdata proyek anda:

```sql
ALTER TABLE django_comments MODIFY ip_address VARCHAR(39);
```

Untuk Oracle, jalankan permintaan ini:

```sql
ALTER TABLE DJANGO_COMMENTS MODIFY (ip_address VARCHAR2(39));
```

Jika anda tidak memberlakukan perubahan ini, perilaku tidak berubah: di MySQL, alamat IPv6 secara diam dipotong; di Oracle, sebuah pengecualian dibangkitkan. Tidak ada perubahan basisdata dibutuhkan untuk basisdata SQLite atau PostgreSQL.

### Harfiah persen di permintaan `cursor.execute`

Ketika anda sedang menjalankan permintaan SQL mentah melalui metode [cursor.execute](/id/5.2/topics/db/sql/#executing-custom-sql), aturan mengenai hardiah persen ganda (`%`) didalam permintaan telah kompak. Perilaku lama bergantung di backend basisdata. Sekarang, lintas semua backend, anda hanya butuh menggandakan karakter persen harfiah jika anda sedang juga menyediakan parameter pengganti. Sebagai contoh:

```
# No parameters, no percent doubling
cursor.execute("SELECT foo FROM bar WHERE baz = '30%'")

# Parameters passed, non-placeholders have to be doubled
cursor.execute("SELECT foo FROM bar WHERE baz = '30%%' and id = %s", [self.id])
```

Pengguna `SQLite` butuh memeriksa dan memperbaharui permintaan tersebut.

### Teks bantuan dari bidang formulir model untuk bidang ManyToManyField

Membangun HTML dari bidang formulir model sesuai pada bidang model [`ManyToManyField`](/id/5.2/ref/models/fields/#django.db.models.ManyToManyField) digunakan untuk mendapatkan kalimat kode-keras:

> *Tekan "Control", atau "Command" pada Mac, untuk memilih lebih dari satu.*

(atau terjemahannya pada lokal aktif) dikenakan sebagai bantuan lagenda ditampilkan bersama mereka jika tak ada [`model`](/id/5.2/ref/models/fields/#django.db.models.Field.help_text) maupun [`form`](/id/5.2/ref/forms/fields/#django.forms.Field.help_text) atribut `help_text` telah ditentukan oleh pengguna (atau string ini telah ditambahkan ke setiap `help_text` yang telah disediakan).

Sejak ini terjadi di lapisan model, tidak ada cara mencegah teks dari muncul di kasus-kasus domana itu tidak berlaku seperti bidang formulir yang menerapkan interaksi pengguna yang anda tidak melibatkan papan kunci dan/atau sebuah tetikus.

Dimulai dengan Django 1.6, sebagai sebuah ketentuan kesesuaian-kebelakang sementara ad-hoc, logika untuk menambahkan kalimat "Hold down..." telah dipindahkan ke lapisan bidang formulir model dan dirubah untuk menambahkan hanya teks ketika widget terkait adalah [`SelectMultiple`](/id/5.2/ref/forms/widgets/#django.forms.SelectMultiple) atau subkelas terpilih.

Perubahan ini dapat mempengaruhi anda di cara ketidaksesuaian kebelakang jika anda menggunakan bidang formulir model penyesuaian dan/atau widget untuk bidang model `ManyToManyField` yang UI nya bergantung pada ketentuan otomatis dari kalimat kode-kerasyang disebutkan. Penerapan bidang formulir ini butuh menyesuaikan ke skenario baru dengan menyediakan penanganan milik mereka dari atribut `help_text`.

Apliaksi yang menggunakan fasilitas [model form](/id/5.2/topics/forms/modelforms/) Django bersama-sama dengan formulir siap-pakai Django [fields](/id/5.2/ref/forms/fields/) dan  [widgets](/id/5.2/ref/forms/widgets/) tidak terpengaruh tetapi butuh disadari dari apa digambarkan dalam [Mung dari teks bantuan dari bidang formulir model untuk bidang-bidang ManyToManyField](#m2m-help-text-deprecation) dibawah.

### Perulangan QuerySet

Perulangan `QuerySet` telah berubah untuk segera merubah semua baris yang diambil pada obyek `Model`. Di Django 1.5 dan lebih awal untuk mengambil baris telah dirubah ke obyek `Model` dalam 100 potongan.

Kode yang ada akan bekerja, tetapi sejumlah baris dirubah ke obyek mungkin berubah dalam kasus penggunaan tertentu. Penggunaan seperti itu termasuk sebagian berulang terhadap sebuah queryset atau penggunaan apapun yang mengakhiri melakukan `__bool__` atau `__contains__`.

Terutama kebanyakan backend basisdata melakukan pengambilan semua baris dalam satu pergi sudah di 1.5.

Itu masih memungkinkan merubah barisan diambil pada obyek `Model` lazily dengan menggunakan metode [`iterator()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.iterator).

### [`BoundField.label_tag`](/id/5.2/ref/forms/api/#django.forms.BoundField.label_tag) sekarang menyertakan [`label_suffix`](/id/5.2/ref/forms/api/#django.forms.Form.label_suffix) formulir

Ini adalah konsisten dengan bagaimana metode seperti [`Form.as_p`](/id/5.2/ref/forms/api/#django.forms.Form.as_p) dan [`Form.as_ul`](/id/5.2/ref/forms/api/#django.forms.Form.as_ul) membangun label.

Jika anda secara manual membangun `label_tag` dalam cetakan anda:

```html+django
{{ form.my_field.label_tag }}: {{ form.my_field }}
```

anda akan ingin memindahkan titik dua (atau apapun pemisah lainnya anda mungkin gunakan) untuk menghindari penggandaan itu ketika meningkatkan ke Django 1.6. Cetakan berikut di Django 1.6 akan membangun secara mirip ke cetakan diatas di Django 1.5, kecuali bahwa titik koma akan muncul didalam unsur `<label>`.

```html+django
{{ form.my_field.label_tag }} {{ form.my_field }}
```

akan membangun sesuatu seperti:

```html
<label for="id_my_field">My Field:</label> <input id="id_my_field" type="text" name="my_field" />
```

Jika anda ingin menjaga perilaku saat ini dari membangun `label_tag` tanpa `label_suffix`, instatiate formulir `label_suffix=''`. Anda dapat juga menyesuaikan `label_suffix` di berdasarkan per-bidang menggunakan parameter `label_suffix` baru di [`label_tag()`](/id/5.2/ref/forms/api/#django.forms.BoundField.label_tag).

### Tampilan admin parameter GET `_changelist_filters`

To achieve preserving and restoring list view filters, admin views now
pass around the `_changelist_filters` GET parameter. It's important that you
account for that change if you have custom admin templates or if your tests
rely on the previous URLs. If you want to revert to the original behavior you
can set the
[`preserve_filters`](/id/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.preserve_filters) attribute to `False`.

### Penyetelan kembali sandi `django.contrib.auth` menggunakan pengkodean berbasis 64 dari PK `User`

Past versions of Django used base 36 encoding of the `User` primary key in
the password reset views and URLs
(`django.contrib.auth.views.password_reset_confirm()`). Base 36 encoding is
sufficient if the user primary key is an integer, however, with the
introduction of custom user models in Django 1.5, that assumption may no longer
be true.

`django.contrib.auth.views.password_reset_confirm()` has been modified to
take a `uidb64` parameter instead of `uidb36`. If you are reversing this
view, for example in a custom `password_reset_email.html` template, be sure
to update your code.

A temporary shim for `django.contrib.auth.views.password_reset_confirm()`
that will allow password reset links generated prior to Django 1.6 to continue
to work has been added to provide backwards compatibility; this will be removed
in Django 1.7. Thus, as long as your site has been running Django 1.6 for more
than `PASSWORD_RESET_TIMEOUT_DAYS`, this change will have no effect.
If not (for example, if you upgrade directly from Django 1.5 to Django 1.7),
then any password reset links generated before you upgrade to Django 1.7 or
later won't work after the upgrade.

Sebagai tambahan, jika anda mempunyai apapun penyesuaian URL setel kembali sandi, anda akan butuh memperbaharui mereka dengan mengganti `uidb36` dengan `uidb64` dan tanda garis yang mengikuti pola dengan sebuah garis miring. Juga tambah `_\-` ke daftar dari karakter yang mungkin cocok dengan pola `uidb64`.

Sebagai contoh:

```
url(
    r"^reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$",
    "django.contrib.auth.views.password_reset_confirm",
    name="password_reset_confirm",
),
```

menjadi:

```
url(
    r"^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$",
    "django.contrib.auth.views.password_reset_confirm",
    name="password_reset_confirm",
),
```

Anda mungkin juga ingin menambahkan shim untuk mendukung gaya lama tautan setel kembali. Menggunakan contoh diatas, anda akan merubah url yang ada dengan mengganti `django.contrib.auth.views.password_reset_confirm` dengan `django.contrib.auth.views.password_reset_confirm_uidb36` dan juga memindahkan argumen `name` jadi itu tidak bertentangan dengan url baru:

```
url(
    r"^reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$",
    "django.contrib.auth.views.password_reset_confirm_uidb36",
),
```

Anda dapat memindahkan pola URL ini setelah aplikasi anda disebarkan dengan Django 1.6 untuk `PASSWORD_RESET_TIMEOUT_DAYS`.

### Serialisasi sesi awalan diganti ke JSON

Historically, [`django.contrib.sessions`](/id/5.2/topics/http/sessions/#module-django.contrib.sessions) used [`pickle`](https://docs.python.org/3/library/pickle.html#module-pickle) to serialize
session data before storing it in the backend. If you're using the [signed
cookie session backend](/id/5.2/topics/http/sessions/#cookie-session-backend) and [`SECRET_KEY`](/id/5.2/ref/settings/#std-setting-SECRET_KEY) is
known by an attacker (there isn't an inherent vulnerability in Django that
would cause it to leak), the attacker could insert a string into their session
which, when unpickled, executes arbitrary code on the server. The technique for
doing so is simple and easily available on the internet. Although the cookie
session storage signs the cookie-stored data to prevent tampering, a
[`SECRET_KEY`](/id/5.2/ref/settings/#std-setting-SECRET_KEY) leak immediately escalates to a remote code execution
vulnerability.

Serangan ini dapat diredakan dengan menserialkan data sesi menggunakan JSON daripada [`pickle`](https://docs.python.org/3/library/pickle.html#module-pickle). Untuk menfasilitasi ini, Django 1.5.3 memperkenalkan pengaturan baru, [`SESSION_SERIALIZER`](/id/5.2/ref/settings/#std-setting-SESSION_SERIALIZER), untuk menyesuaikan bentuk serialisasi sesi. Untuk kesesuaian kebelakang, awalan pengaturan ini menggunakan [`pickle`](https://docs.python.org/3/library/pickle.html#module-pickle) di Django 1.5.3, tetapi kami telah merubah awalan ke JSOn di 1.6. Jika anda meningkatkan dan mengganti dari pickle ke JSON, sesi dibuat sebelum peningkatan akan hilang. Selagi serialisasi JSON tidak mendukung semua obyek Python seperti [`pickle`](https://docs.python.org/3/library/pickle.html#module-pickle) lakukan, kami sangat menganjurkan menggunakan sesi serialisasi-JSON. Waspada dari berikut ketika memeriksa kode anda untuk menentukan jika serialisasi JSON akan bekerja untuk aplikasi anda:

- JSON membutuhkan kunci string, jadi anda kemungkinan akan berjalan kedalam masalah jika anda sedang menggunakan kunci bukan-string di `request.session`.
- Setel kadaluarsa sesi dengan melewatkan nilai `datetime` ke [`set_expiry()`](/id/5.2/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.set_expiry) akan tidak bekerja seperti nilai `datetime` adalah tidak dapat serialisasi di JSON. Anda dapat menggunakan nilai integer sebagai gantinya.

Lihat dokumentasi [Serialisasi sesi](/id/5.2/topics/http/sessions/#session-serialization) untuk lebih rinci.

### Perubahan Object Relational Mapper

Django 1.6 mengandung banyak perubahan pada ORM. Perubahan ini dibagi menjadi tiga kategori:

1. Perbaikan kesalahan (sebagai contoh klausa join benar untuk hubungan umum, memadukan permintaan, kenaikan join, dan perbaikan memotong join)
2. Perssiapan untuk fitur baru. Sebagai contoh, ORM sekarang secara internal siap untuk foreign key banyak kolom.
3. Pembersihan umum.

Perubahan ini dapat menghasilkan di beberapa masalah kesesuaian. Sebagai contoh, beberapa permintaan akan sekarang membangkitkan nama lain tabel berbeda. Ini dapat mempengaruhi [`QuerySet.extra()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.extra). Sebagai tambahan beberapa permintaan akan sekarang membuat hasil berbeda. Sebuah contoh adalah [`exclude(condition)`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.exclude) dimana kondisi adalah satu rumit (mengacu banyak penyertaan didalam [`Q objects`](/id/5.2/ref/models/querysets/#django.db.models.Q)). Dalam banyak kasus permintaan yang dipengaruhi tidak membuat hasil di Django 1.5 tetapi melakukan sekarang. Sayangnya ada juga kasus-kasus yang membuat hasil berbeda, tetapi juga tidak Django 1.5 maupun 1.6 membuat hasil benar.

Akhirnya, terdapat banyak perubahan pada API internal ORM.

### Bermacam-macam

- `django.db.models.query.EmptyQuerySet` tidak dapat diinstiasikan lagi - itu adalah hanya berguna sebagai penanda kelas untuk memeriksa jika [`none()`](/id/5.2/ref/models/querysets/#django.db.models.query.QuerySet.none) telah dipanggil: `isinstance(qs.none(), EmptyQuerySet)`
- Jika kode CSS/JavaScript anda digunakan untuk mengakses widget masukan HTML berdasarkan jenis, anda harus meninjau kembali itu seperti widget `type='text'` mungkin sekarang mengeluarkan seperti `type='email'`, `type='url'` atau `type='number'` tergantung pada jenis bidang yang sesuai mereka.
- [`error_messages`](/id/5.2/ref/forms/fields/#django.forms.Field.error_messages) bidang formulir yang mengandung placeholder harus sekarang selalu menggunakan bernama placeholder(`"ilai '%(value)' terlalu besar"` daripada `"Nilai '%s' terlalu besar"`). Lihat bidang sesuai untuk rincian tentang nama-nama dari placeholder. Perubahan di 1.6 terutama mempengaruhi [`DecimalField`](/id/5.2/ref/forms/fields/#django.forms.DecimalField) dan [`ModelMultipleChoiceField`](/id/5.2/ref/forms/fields/#django.forms.ModelMultipleChoiceField).
- Beberapa [`error_messages`](/id/5.2/ref/forms/fields/#django.forms.Field.error_messages) untuk [`IntegerField`](/id/5.2/ref/forms/fields/#django.forms.IntegerField), [`EmailField`](/id/5.2/ref/forms/fields/#django.forms.EmailField), `IPAddressField`, [`GenericIPAddressField`](/id/5.2/ref/forms/fields/#django.forms.GenericIPAddressField), dan [`SlugField`](/id/5.2/ref/forms/fields/#django.forms.SlugField) telah tertindih karena mereka menggandakan pesan kesalahan yang sudah disediakan oleh pengecek diikat ke bidang.
- Karena sebuah perubahan di alur kerja pengesahan formulir, metode [`TypedChoiceField`](/id/5.2/ref/forms/fields/#django.forms.TypedChoiceField) `coerce` harus selalu mengembalikan sebuah nilai hadir di atribut bidang `choices`. Batasan tersebut harus diangkat kembali di Django 1.7.
- Telah ada perubahan di cara waktu habis ditangani di backend cache. Secara eksplisit melewatkan di `timeout=None` tidak lagi mengasilkan di penggunaan awalan waktu habis. itu akan sekarang menyetel waktu habis bukan-kadaluarsa. Melewatkan 0 kedalam backend memcached tidak lagi menggunakan awalan waktu habis, dan sekarang akan menyetel-dan-berakhir-segera nilai.
- Aplikasi `django.contrib.flatpages` digunakan untuk menyetel kepala HTTP penyesuaian untuk tujuan mencari kesalahan. Kegunaan ini tidak didokumentasikan dan membuat menyembunyikan tidak efektif jadi itu telah dipindahkan, bersama dengan penerapan umumnya, sebelumnya tersedia di `django.core.xheaders`.
- `XViewMiddleware` telah dipindahkan dari `django.middleware.doc` ke `django.contrib.admindocs.middleware` karena itu adalah sebuah penerapan rincian dari admindoc, terbukti tidak menjadi digunakan kembali secara umum.
- [`GenericIPAddressField`](/id/5.2/ref/models/fields/#django.db.models.GenericIPAddressField) sekarang akan hanya mengizinkan nilai `blank` jika nilai `null` juga diizinkan. Membuat sebuah `GenericIPAddressField` dimana `blank` diizinkan tetapi `null` tidak akan memicu sebuah kesalahan pengesahan model karena nilai `blank` selalu disimpan sebagai `null`. Sebelumnya, menyimpan nilai `blank` di bidang yang tidak mengizinkan `null` akan menyebabkan pengecualian basisdata pada waktu berjalan.
- Jika sebuah pengecualian `NoReverseMatch` dimunculkan dari sebuah metode ketika membangun sebuah cetakan, itu adalah tidak diam. Sebagai contoh, `{{ obj.view_href }}` akan menyebabkan cetakan membangun menjadi gagal jika `view_href()` memunculkan `NoReverseMatch`. Tidak ada perubahan pada etiket [`{% url %}`](/id/5.2/ref/templates/builtins/#std-templatetag-url), itu menyebabkan membangun cetakan menjadi gagal seperti selalu ketika `NoReverseMatch` dimunculkan.
- [`django.test.Client.logout()`](/id/5.2/topics/testing/tools/#django.test.Client.logout) sekarang memanggil [`django.contrib.auth.logout()`](/id/5.2/topics/auth/default/#django.contrib.auth.logout) yang akan mengirim sinyal [`user_logged_out()`](/id/5.2/ref/contrib/auth/#django.contrib.auth.signals.user_logged_out).
- [Authentication views](/id/5.2/topics/auth/default/#built-in-auth-views) are now reversed by name,
  not their locations in `django.contrib.auth.views`. If you are using the
  views without a `name`, you should update your `urlpatterns` to use
  `django.conf.urls.url()` with the `name` parameter. For example:

  ```
  (r"^reset/done/$", "django.contrib.auth.views.password_reset_complete")
  ```

  menjadi:

  ```
  url(
      r"^reset/done/$",
      "django.contrib.auth.views.password_reset_complete",
      name="password_reset_complete",
  )
  ```
- [`RedirectView`](/id/5.2/ref/class-based-views/base/#django.views.generic.base.RedirectView) now has a `pattern_name`
  attribute which allows it to choose the target by reversing the URL.
- Di Django 1.4 dan 1.5, string kosong tidak sengaja dianggap sandi yang sah. Ini berarti [`set_password()`](/id/5.2/ref/contrib/auth/#django.contrib.auth.models.User.set_password) akan menyimpan sandi kosong sebagai sandi tidak berguna seperti [`set_unusable_password()`](/id/5.2/ref/contrib/auth/#django.contrib.auth.models.User.set_unusable_password) lakukan, dan dengan demikian [`check_password()`](/id/5.2/ref/contrib/auth/#django.contrib.auth.models.User.check_password) selalu dikembalikan `False` untuk sandi kosong. Ini telah diperbaiki di terbitan ini: sandi kosong adalah sekarang sah.
- Admin [`changelist_view`](/id/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.changelist_view) sebelumnya menerima sebuah parameter GET `pop` untuk menandakan itu telah ditampilkan di popup. Parameter ini telah dinamai menjadi `_popup` untuk tetap konsisten dengan sisa dari tampilan admin. Anda harus memperbaharui cetakan penyesuaian anda jika mereka menggunakan nama parameter sebelumnya.
- [`validate_email()`](/id/5.2/ref/validators/#django.core.validators.validate_email) sekarang menerima alamat surel dengan `localhost` sebagai ranah.
- The new [`makemessages --keep-pot`](/id/5.2/ref/django-admin/#cmdoption-makemessages-keep-pot) option prevents deleting the
  temporary `.pot` file generated before creating the `.po` file.
- `django.core.servers.basehttp.WSGIServerException` yang tidak didokumentasikan telah dipindahkan. Gunakan `socket.error` disediakan oleh pustaka standar sebagai gantinya. Perubahan ini juga diterbitkan di Django 1.5.5.
- Tanda tangan dari [`django.views.generic.base.RedirectView.get_redirect_url()`](/id/5.2/ref/class-based-views/base/#django.views.generic.base.RedirectView.get_redirect_url) telah berubah dan sekarang menerima argumen penempatan juga (`*args, **kwargs`). Apapun kelompok ditangkap tidak bernama akan sekarang diloloskan ke `get_redirect_url()` yang mungkin menghasilkan sebuah `TypeError` jika anda tidak memperbaharui tanda tangan dari metode penyesuaian anda.

## Fitur diusangkan di 1.6

### Transaksi pengelolaan API

Pengelolaan transaksi sepenuhnya dirombak di Django 1.6, dan API saat ini diusangkan:

- `django.middleware.transaction.TransactionMiddleware`
- `django.db.transaction.autocommit`
- `django.db.transaction.commit_on_success`
- `django.db.transaction.commit_manually`
- Pengaturan `TRANSACTIONS_MANAGED`

### `django.contrib.comments`

Kerangka kerja komentar Django telah diusangkan dan tidak lagi didukung. Itu akan tersedia di Django 1.6 dan 1.7, dan dipindahkan di Django 1.8. Kebanyakan pengguna akan menjadi lebih baik dilayani dengan pemecahan penyesuaian, atau produk disimpan seperti [Disqus](https://disqus.com/).

Kode dahulu dikenal sebagai `django.contrib.comments`  [still available in an external repository](https://github.com/django/django-contrib-comments).

### Mendukung untuk PostgreSQL versi lebih lama dari 8.4

Akhir dari masa dukungan hulu telah tercapai di Desember 2011 untuk PostgreSQL 8.2 dan di February 2013 untuk 8.3.  Sebagai konsekuensinya, Django 1.6 menyetel 8.4 sebagai versi minimal PostgreSQL itu secara resmi dukung.

Anda sangat didorong menggunakan versi paling terakhir dari PostgreSQL tersedia, karena dari perbaikan peningkatan dan untuk mengambil keuntungan dari replikasi aliran alamiah tersedia di PostgreSQL 9.x.

### Perubahan ke [`cycle`](/id/5.2/ref/templates/builtins/#std-templatetag-cycle) dan [`firstof`](/id/5.2/ref/templates/builtins/#std-templatetag-firstof)

Sistem cetakan umumnya meloloskan semua variabel untuk menghindari serangan XSS. Bagaimanaoun, karena sebuah kecelakaan sejarah, etiket [`cycle`](/id/5.2/ref/templates/builtins/#std-templatetag-cycle) dan [`firstof`](/id/5.2/ref/templates/builtins/#std-templatetag-firstof) membangun argumen mereka dengan adanya.

Django 1.6 starts a process to correct this inconsistency. The `future`
template library provides alternate implementations of [`cycle`](/id/5.2/ref/templates/builtins/#std-templatetag-cycle) and
[`firstof`](/id/5.2/ref/templates/builtins/#std-templatetag-firstof) that autoescape their inputs. If you're using these tags,
you're encouraged to include the following line at the top of your templates to
enable the new behavior:

```html+django
{% load cycle from future %}
```

atau:

```html+django
{% load firstof from future %}
```

Etiket menerapkan perilaku lama telah diusangkan, dan di Django 1.8, perilaku lama akan diganti dengan perilaku baru. Untuk memastikan kesesuaian dengan versi masa depan dari Django, cetakan yang ada harus dirubah untuk menggunakan versi `future`.

Jika diperlukan, anda dapat sementara meniadakan pelolosan-otomatis dengan [`mark_safe()`](/id/5.2/ref/utils/#django.utils.safestring.mark_safe) atau [`{% autoescape off %}`](/id/5.2/ref/templates/builtins/#std-templatetag-autoescape).

### Pengaturan `CACHE_MIDDLEWARE_ANONYMOUS_ONLY`

`CacheMiddleware` dan `UpdateCacheMiddleware` digunakan untuk menyediakan cara untuk menyimpan sementara permintaan hanya jika mereka tidak dibuat oleh pengguna masuk. Mekanisme ini telah sebagian besar tidak efektif karena middleware dengan benar mengambil kedalam akun kepala HTTP `Vary: Cookie`, dan kepala ini sedang dikirim di berbagai kesempatan, seperti:

- mengkases sesi, atau
- menggunakan perlindungan CSRF, yang menghidupkan secara awal, atau
- menggunakan pustaka sisi klien yang menyetel kue, seperti [Google Analytics](https://marketingplatform.google.com/about/analytics/).

Ini membuat tembolok secara efektif bekerja pada berdasarkan per-sesi tanpa memperhatikan pengaturan `CACHE_MIDDLEWARE_ANONYMOUS_ONLY`.

### Pengaturan `SEND_BROKEN_LINK_EMAILS`

[`CommonMiddleware`](/id/5.2/ref/middleware/#django.middleware.common.CommonMiddleware) digunakan untuk menyediakan pelaporan dasar dari tautan rusak oleh surel ketika `SEND_BROKEN_LINK_EMAILS` disetel menjadi `True`.

Karena masalah pengurutan yang keras kepala diantara [`CommonMiddleware`](/id/5.2/ref/middleware/#django.middleware.common.CommonMiddleware) dan [`LocaleMiddleware`](/id/5.2/ref/middleware/#django.middleware.locale.LocaleMiddleware), fitur ini telah dipisah menjadi middleware: [`BrokenLinkEmailsMiddleware`](/id/5.2/ref/middleware/#django.middleware.common.BrokenLinkEmailsMiddleware).

Jika anda bergantung pada fitur ini, anda harus menambahkan `'django.middleware.common.BrokenLinkEmailsMiddleware'` ke pengaturan `MIDDLEWARE_CLASSES` anda dan memindahkan `SEND_BROKEN_LINK_EMAILS` dari pengaturan anda.

### Metode `_has_changed` di widgets

Jika anda menentukan widget formulir anda sendiri dan menentukan metode `_has_changed` pada sebuah widget anda harus sekarang menentukan metode ini di bidang formulir itu sendiri.

### Model `module_name` atribut \_meta

`Model._meta.module_name` telah dinamai kembali ke `model_name`. Meskipun menjadi sebuah API pribadi, itu akan melalui jalur pengusangan biasa.

### Model `get_(add|change|delete)_permission` \_meta methods

Metode `Model._meta.get_(add|change|delete)_permission` telah diusangkan. Bahkan jika mereka adalah bukan bagian dari API umum mereka akan juga pergi melalui jalur pengusangan biasa. Anda dapat mengganti mereka dengan `django.contrib.auth.get_permission_codename('action', Model._meta)` dimana `'action'` adalah `'add'`, `'change'`, atau `'delete'`.

### `get_query_set` dan metode mirip dinamai kembali menjadi `get_queryset`

Metode yang mengembalikan sebuah `QuerySet` seperti `Manager.get_query_set` atau `ModelAdmin.queryset` telah dinamai menjadi `get_queryset`.

Jika anda sedang menulis pustaka yang menerapkan, sebagai contoh, sebuah metode `Manager.get_query_set`, dan anda butuh mendukung versi Django lama, anda harus menamai kembali cara dan kondisional tambah sebuah nama lain dengan nama lama:

```
class CustomManager(models.Manager):
    def get_queryset(self):
        pass  # ...

    if django.VERSION < (1, 6):
        get_query_set = get_queryset

    # For Django >= 1.6, models.Manager provides a get_query_set fallback
    # that emits a warning when used.
```

Jika anda sedang menulis pustaka yang butuh memanggil metode `get_queryset` dan harus mendukung versi Django lama, anda harus menulis:

```
get_queryset = (
    some_manager.get_query_set
    if hasattr(some_manager, "get_query_set")
    else some_manager.get_queryset
)
return get_queryset()  # etc
```

Di kasus umum dari penyesuaian pengelola yang kedua menerapkan metode `get_queryset` milik nya dan memanggil metode itu, dan butuh bekerja dengan versi Django terlama, dan pustaka yang belum diperbaharui, itu adalah berguna untuk menentukan sebuah metode `get_queryset_compat` seperti dibawah dan menggunakannya secara internal ke pengelola anda:

```
class YourCustomManager(models.Manager):
    def get_queryset(self):
        return YourCustomQuerySet()  # for example

    if django.VERSION < (1, 6):
        get_query_set = get_queryset

    def active(self):  # for example
        return self.get_queryset_compat().filter(active=True)

    def get_queryset_compat(self):
        get_queryset = (
            self.get_query_set if hasattr(self, "get_query_set") else self.get_queryset
        )
        return get_queryset()
```

Ini membantu mengecilkan perubahan yang dibutuhkan, tetapi juga bekerja dengan benar di kasus dari subkelas (seperti `RelatedManagers` dari Django 1.5) yang mungkin menimpa salah satu `get_query_set` atau `get_queryset`.

### tampilan `jalan pintas` dan URLconf

Tampilan `jalan pintas` dipindahkan dari `django.views.defaults` ke `django.contrib.contenttypes.views` segera setelah terbitan 1.0, tetapi tempat lama tidak pernah diusangkan. Kekeliruan ini diperbaiki di Django 1.6 dan anda seharusnya sekarang gunakan tempat baru.

URLconf `django.conf.urls.shortcut` juga telah diusangkan. Jika anda sedang menyertakan itu di sebuah URLconf, cukup ganti:

```
(r"^prefix/", include("django.conf.urls.shortcut")),
```

dengan:

```
(
    r"^prefix/(?P<content_type_id>\d+)/(?P<object_id>.*)/$",
    "django.contrib.contenttypes.views.shortcut",
),
```

### `ModelForm` tanpa `fields` atau `exclude`

Sebelumnya, jika anda ingin sebuah [`ModelForm`](/id/5.2/topics/forms/modelforms/#django.forms.ModelForm) untuk memakai semua bidang pada model, anda dapat cukup menghilangkan atribut `Meta.fields`, dan semua bidang akan digunakan.

Ini dapat membawa pada masalah keamanan dimana bidang ditambahkan ke model dan, tidak sengaja, secara otomatis menjadi dapat disunting oleh pengguna akhir. Di beberapa kasus, khususnya dengan bidang boolean, itu memungkinkan untuk masalah ini secara lengkap nampak. Ini adalah sebuah formulir [Mass assignment vulnerability](https://en.wikipedia.org/wiki/Mass_assignment_vulnerability).

Untuk alasan ini, perilaku ini diusangkan, dan menggunakan pilihan `Meta.exclude` sangat kecil. Meskipun semua bidang yang dimaksud untuk penyertaan di formulir harus didaftarkan secara eksplisit di atribut `field`.

Jika perhatian keamanan sangat tidak berlaku di kasus anda, ada sebuah jalan pintas untuk secara eksplisit mengindikasikan bahwa semua bidang harus digunakan - gunakan nilai khusus "\_\_all\_\_"\` untuk atribut bidang:

```
class MyModelForm(ModelForm):
    class Meta:
        fields = "__all__"
        model = MyModel
```

Jika anda mempunyai penyesuaian `ModelForms` yang hanya butuh digunakan di admin, ada pilihan lain. Admin mempunyai metode sendiri untuk menentukan bidang (`fieldsets` dll), dan juga menambahkan daftar dari bidang ke `ModelForm` adalah berlebihan. Sebagai gantinya, cukup hilangkan kelas sebelah dalam `Meta` dari `ModelForm`, atau hilangkan atribut `Meta.model`. Sejak subkelas `ModelAdmin` mengetahui model mana ini untuk, itu dapat menambahkan atribut yang dibutuhkan untuk memperoleh fungsi `ModelForm`. Perilaku ini juga bekerja untuk versi Django lebih awal.

### `UpdateView` dan `CreateView` tanpa bidang eksplisit

Tampilan umum [`CreateView`](/id/5.2/ref/class-based-views/generic-editing/#django.views.generic.edit.CreateView) dan [`UpdateView`](/id/5.2/ref/class-based-views/generic-editing/#django.views.generic.edit.UpdateView), dan apapun diperoleh dari [`ModelFormMixin`](/id/5.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin), adalah rentan pada masalah keamanan digambarkan di bagian diatas, karena mereka dapat secara otomatis membuat sebuah `ModelForm` yang menggunakan semua bidang untuk sebuah model.

Untuk alasan ini, jika anda menggunakan tampilan ini untuk menyunting model, adna harus juga memasok atribut `field` (baru di Django 1.6), yaitu sebuah daftar bidang model dan bekerja di cara sama seperti atribut [`ModelForm`](/id/5.2/topics/forms/modelforms/#django.forms.ModelForm) `Meta.fields`. Cara lain, anda dapat menyetel atribut `form_class` ke `ModelForm` yang secara jelas menentukan bidang-bidang akan digunakan. Menentukan sebuah subkelas `UpdateView` or `CreateView` untuk digunakan dengan sebuah model tetapi tanpa sebuah daftar jelas dari bidang-bidang adalah diusangkan.

### Mung dari teks bantuan dari bidang formulir model untuk bidang-bidang `ManyToManyField`

Semua penanganan khusus dari atribut `help_text` dari bidang model `ManyToManyField` dilakukan oleh model standar atau bidang formulir model seperti digambarkan di [Teks bantuan dari bidang formulir model untuk bidang ManyToManyField](#m2m-help-text) diatas adalah diusangkan dan akan dipindahkan di Django 1.8.

Teks bantuan dari bidang-bidang ini akan butuh ditangani antara oleh aplikasi, penyesuaian bidang formulir atau widget, cukup seperti terjadi dengan sisa dari jenis bidang model.
