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 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 untuk menyelesaikan kurang ketatnya permintaan/tanggapan melapisi pada gaya lama dari middleware digambarkan di DEP 0005. Anda akan butuh adapt old, custom middleware dan mengganti dari pengaturan MIDDLEWARE_CLASSES ke pengaturan MIDDLEWARE baru untuk mengambil keuntungan dari perbaikan.

Dukungan resmi untuk nama pengguna Unicode

Model User di django.contrib.auth aslinya hanya menerima huruf ASCII di nama pengguna. Meskipun itu bukan pilihan disengaja, karakter Unicode selalu diterima ketika menggunakan Python 3.

Pengesah nama pengguna sekarang dengan jelas menerima huruf Unicode secara awalan pada hanya 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.

  • Jika pengguna tidak mempunyai perizinan tambah, object-tools menghalangi pada daftar perubahan model akan sekarang dibangun (tanpa tombol tambah, tentunya). Ini membuat itu lebih mudah menambahkan alat penyesuaian dalam kasus ini.

  • 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 logout() mengirim kepala “no-cache” untuk mencegah sebuah masalah dimana penyimpanan Safari mengalihkan dan mencegah pengguna dari dapat keluar.

  • Ditambahkan argumen backend pilihan pada login() untuk mengizinkan menggunakannya tanpa surat kepercayaan.

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

  • Parameter redirect_authenticated_user baru untuk tampilan login() mengizinkan pengalihan otentifikasi pengguna 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

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

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 pilihan collectstatic --ignore_patterns 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

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

  • 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 Extract unuk mengeluarkan komponen datetime sebagai integer, seperti tahun dan jam.

  • Ditambahkan fungsi Trunc untuk memotong tanggal atau datetime pada komponen yang 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.

  • Ditambahkan metode HttpResponse readable() dan seekable() untuk membuat sebuah contoh obyek seperti-arus dan mengizinkan membungkusnya dengan io.TextIOWrapper.

  • Ditambahkan aribut HttpResponse.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

URL

  • Sebuah tambahan di django.setup() mengizinkan URL menangani yang terjadi diluar dari siklus permintaan/tanggapan (sebagai contoh di perintah pengelolaan dan tulisan berdiri sendiri) untuk mengambil FORCE_SCRIPT_NAME kedalam akun ketiks dia disetel.

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.

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

Kami mempertimbangkan peningkatan sampai 254 karakter untuk lebih mudah mengizinkan penggunaan alamat surel (yang terbatas sampai 254 karakter) sebagai nama pengguna tetapi ditolak karena batasan MySQL. Ketika menggunakan penyandian utf8mb4 (dianjurkan untuk dukungan Unicode sesuai), MySQL dapat hanya membuat indeks unik dengan 191 karakter secara awal. Karena itu, jika anda butuh panjang lebih, harap gunakan model pengguna penyesuaian.

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:

'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

Pendaftaran aplikasi tidak lagi otomatis dikumpulkan ketika membongkar model. Ini telah ditambahkan di Django 1.7.2 sebagai sebuah usaha untuk mengizinkan membongkar model diluar Django, seperti di pekerja RQ, tanpa memanggil django.setup(), tetapi itu membuat kemungkinan dari sebuah kebuntuan. Untuk menyesuaikan kode anda dalam kasus RQ, anda dapat provide your own worker script yang memanggil 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.

Jika anda mempunyai proyek Django lama dengan MD5 atau SHA1 (bahkan tergarami) sandi dikodekan, sadarilah bahwa ini dapat dirusak dengan mudah dengan perangkat keras hari ini. Untuk membuat pengguna Django mengakui penggunaan berkelanjutan dari pengacak lemah, pencampur berikut dipindahkan dari PASSWORD_HASHERS setting awal:

'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:

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.

  • Dalam terangnya perubahan sebelumnya, percobaan metode login() klien tidak lagi selalu menolak pengguna tidak aktif tetapi malahan menugaskan keputusan ini ke backend otentifikasi. force_login() juga menugaskan keputusan ke backend otentifikasi, jadi jika anda sedang menggunakan backend awal, anda butuh menggunakan pengguna aktif.

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

  • Atribut base_field dari RangeField sekarang jenis dari bidang, bukan sebuah instance dari bidang. Jika anda telah membuat subkelas penyesuaian dari RangeField, anda harus merubah atribut base_field.

  • 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().

  • Penangan WSGI tidak lagi memindahkan isi dari tanggapan dari permintaan HEAD atau tanggapan dengan status_code dari 100-199, 204, atau 304. Kebanyakan peladen Jaringan sudah menerapkan perilaku ini. Tanggapan diambil menggunakan klien percobaan Django untuk memiliki “response fixes” diberlakukan.

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

  • Ketika USE_L10N adalah True, lokalisasi sekarang berlaku untuk penyaring date dan time ketika tidak ada bentuk string ditentukan. Penentu DATE_FORMAT dan TIME_FORMAT dari lokal aktif digunakan daripada mengatur nama sama.

Fitur-fitur diusangkan di 1.10

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

Daripada menugaskan obyek terhubung menggunakan penugasan langsung:

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

Penggunaan metode set() ditambahkan di 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).

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

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

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 dipindahkan, dan you must upgrade ke 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.

  • Obyek cetakan Django dikembalikan oleh get_template() dan select_template() tidak lagi menerima sebuah Context di metode render() mereka.

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

Back to Top