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 dalam django.contrib.auth aslinya hanya menerima huruf ASCII dan angka dalam nama penggna. Meskipun itu bukan pilhan disengaja, karakter Unicode selalu diterima ketika menggunakan Python 3.
Pengesah nama pengguna sekarang jelas menerima karakter Unicode secara awalan pada hanya Python 3. Perilaku awalan ini dapat ditimpa dengan merubah atribut username_validator dari model User, atau ke proxy manapun dari model itu, menggunakan baik ASCIIUsernameValidator atau UnicodeUsernameValidator. Model pengguna penyesuaian mungkin juga menggunakan pengesah tersebut.
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 kerequest.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-Policyjika anda ingin. - Atribut
InlineModelAdmin.classesbaru mengizinkan menetapkan kelas-kelas pada deretam kumpulan bidang. Berderet dengan kelascollapseakan awalnya diruntuhkan dan kepala mereka akan mempunyai tautan "show" kecil. - Jika pengguna tidak mempunyai perizinan tambah,
object-toolsmenghalangi pada daftar perubahan model akan sekarang dibangun (tanpa tombol tambah, tentunya). Ini membuat itu lebih mudah menambahkan alat penyesuaian dalam kasus ini. - Model
LogEntrysekarang menyimpan pesan-pesan berubah di struktur JSON sehingga pesan dapat secara dinamis diterjemahkan menggunakan bahasa aktif saat ini. MetodeLogEntry.get_change_message()baru sekarang dipilih dari mengambil pesan berubah. - Obyek terpilih untuk bidang di
ModelAdmin.raw_id_fieldssekarang mempunyai sebuah tautan ke formulir rubah obyek. - Ditambahkan pilihan "No date" dan "Has date" untuk
DateFieldListFilterjika 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.PBKDF2PasswordHasheruntuk 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
backendpilihan padalogin()untuk mengizinkan menggunakannya tanpa surat kepercayaan. - Pengaturan
LOGOUT_REDIRECT_URLbaru mengendalikan pengalihan dari tampilanlogout(), jika tampilan tidak mendapatkan argumennext_page. - Parameter
redirect_authenticated_userbaru untuk tampilanlogin()mengizinkan pengalihan otentifikasi pengguna mengunjungi halaman masuk. AllowAllUsersModelBackenddanAllowAllUsersRemoteUserBackendbaru mengabaikan nilai dariUser.is_active, selagiModelBackenddanRemoteUserBackendsekarang menolak pengguna tidak aktif.
django.contrib.gis¶
- Distance lookups sekarang menerima pernyataan sebagai jarak parameter nilai.
- Harta
GEOSGeometry.unary_unionbaru menghitung gabungan dari semua unsur dari geometri ini. - Ditambahkan sebutan biner
GEOSGeometry.covers(). - Ditambahkan metode
GDALBand.statistics()dan atributmeandanstd. - Ditambahkan dukungan untuk pengumpulan fungsi
MakeLinedanGeoHashpada SpatiaLite. - Ditambahkan dukungan untuk fungsi
Difference,Intersection, danSymDifferencepada MySQL. - Ditambahkan dukungan untuk instantisi geometri GEOS kosong.
- Harta
trimdanprecisionbaru dariWKTWritermengizinkan mengendalikan keluaran dari bagian pecahan dari kordinat di WKT. - Ditambahkan harta
LineString.closeddanMultiLineString.closed. - GeoJSON serializer sekarang mengeluarkan primary key dari obyek di kamus
propertiesjika bidang tertentu tidak ditetapkan. - Kemampuan melipat data masukan pada metode
GDALBand.data()telah ditambahkan. Pita data sekarang dapat diperbaharui dengan nilai berulang secara efisien. - Ditambahkan fungsi basisdata
IsValiddanMakeValid, sama halnya seperti pencarianisvalid, semua untuk PostGIS. Ini mengizinkan menyaring dan memperbaiki geometri tidak sah pada sisi basisdata. - Ditambahkan dukungan raster untuk semua spatial lookups.
django.contrib.postgres¶
- Untuk meyakinkan,
HStoreFieldsekarang memberikan kunci dan nilainya ke deretan karakter.
django.contrib.sessions¶
- Perintah pengelolaan
clearsessionssekarang memindahkan sesi berdasarkan-berkas.
django.contrib.sites¶
- Model
Sitesekarang mendukung natural keys.
django.contrib.staticfiles¶
- Etiket cetakan
staticsekarang menggunakandjango.contrib.staticfilesjika itu didalamINSTALLED_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 aplikasistaticfilesterpasang. - Anda dapat more easily customize 1 pilihan
collectstatic --ignoredenganAppConfigpenyesuaian.
Tembolok¶
- Backend tembolok berdasarkan-berkas sekarang menggunakan protokol pengasaman tertinggi.
CSRF¶
CSRF_FAILURE_VIEWawal,views.csrf.csrf_failure()sekarang menerima sebuah pilihan parametertemplate_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=Truedan menerapkanDatabaseOperations.fetch_returned_insert_ids()untuk menyetel primary key pada obyek dibuat menggunakanQuerySet.bulk_create(). - Ditambahkan argumen kata kunci pada metode
as_sql()dari beragam pernyataan (Func,When,Case, danOrderBy) untuk mengizinkan backend basisdata untuk menyesuaikan mereka tanpa mengubahself, yang tidak aman menggunakan backend basisdata berbeda. Lihat parameterarg_joinerdan**extra_contextdariFunc.as_sql()untuk sebuah contoh.
Penyimpanan Berkas¶
- Backend penyimpanan sekarang menghadirkan API sadar-zona waktu dengan metode baru
get_accessed_time(),get_created_time(), danget_modified_time(). Mereka mengembalikandatetimewaspada zona waktu jikaUSE_TZadalahTruedandatetimetidak dibuat-buat di zona waktu lokal jikalau tidak. - Metode
Storage.generate_filename()baru membuatnya semakin mudah untuk menerapkan penyimpanan penyesuaian yang tidak menggunakanos.pathmemanggil sebelumnya diFileField.
Formulir¶
- Formulir dan widget
Mediasekarang dilayani menggunakandjango.contrib.staticfilesjika terpasang. - Etiket
<input>dibangun olehCharFieldsekarang menyertakan atributminlengthjika bidang mempunyaimin_length. - Bidang formulir yang diwajibkan sekarang mempunyai atribut HTML
required. Setel atributForm.use_required_attributebaru menjadiFalseuntuk meniadakannya. Atributrequiredtidak disertakan pada formulir dari formset karena pengesahan peramban mungkin tidak benar ketika menambahkan dan menghapus formset.
Internasionalisasi¶
- Fungsi pembantu
i18n_patterns()sekrang dapat digunakan di akar URLConf ditentukan menggunakanrequest.urlconf. - Dengan menyetel parameter
prefix_default_languagebaru untuki18n_patterns()menjadiFalse, 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 parameternextdiPOSTatauGET.- Tampilan berdasarkan kelas
JavaScriptCatalogdanJSONCatalogmenggantikan pengusangan tampilan berdasarkan fungsijavascript_catalog()danjson_catalog(). Tampilan baru hampir sama ke yang lama kecuali itu oleh awal tampilan baru mengumpulkan semua deretan karakter JavaScript di ranag terjemahandjangojsdari semua aplikasi terpasang daripada hanya deretan karakter JavaScript dariLOCALE_PATHS.
Pengelolaan perintah¶
call_command()sekarang mengembalikan nilai dikembalikan dari metodecommand.handle().- Pilihan
check --fail-levelbaru mengizinkan menentukan tingkatan pesan yang akan menyebabkan perintah keluar dengan keadaan bukan nol. - Pilihan
makemigrations --checkbaru membuat perintah keluar dengan keadaan bukan nol ketika model berubah tanpa perpindahan dikenali. makemigrationssekarang menampilkan jalur ke berkas perpindahan yang dia bangkitkan.- Pilihan
shell --interfacesekarang menerimapythonuntuk memaksa menggunakan penafsir Pythonplain. - Pilihan
shell --commandbaru membiarkan anda menjalankan perintah sebagai Django dan keluar, daripada membuka shell interaktif. - Ditambahkan peringatan ke
dumpdatajka model proxy ditentukan (yang menghasilkan tidak ada keluaran) tanpa wujud induknya. - Atribut
BaseCommand.requires_migrations_checksbaru mungkin disetel menjadiTruejika anda ingin perintah anda mencetak peringatan, sepertirunserverlakukan, 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
shellmendukung penyelesaian label pada sistem menggunakanlibedit, misalnya macOS. - Perintah
inspectdbmembiarkan anda memilih tabel apa harus diperiksa dengan menentukan nama-nama mereka sebagai argumen.
Perpindahan¶
- Ditambahkan dukungan untuk serialisasi dari obyek
enum.Enum. - Ditambahkan argumen
elidablepada tindakanRunSQLdanRunPythonuntuk mengizinkan mereka dipindahkan ketika melumat perpindahan. - Ditambahkan dukungan untuk non-atomic migrations dengan mengatur atribut
atomicpadaMigration. - Perintah
migratedanmakemigrationssekarang check for a consistent migration history. Jika mereka menemukan beberapa ketergantungan yang tidak berlaku pada sebuah perpindahan yang dilakukan,InconsistentMigrationHistorymuncul. - Sinyal
pre_migrate()danpost_migrate()sekarang mengirim perpindahanplandanappsmereka.
Model¶
- Membalikkan foreign key dari model proxy sekarang diperbanyak ke wujud kelas mereka. Membalikkan hubungan dilampirkan oleh
ForeignKeymenunjuk 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 sepertiForeignKeydanOneToOneFieldyang menunjuk ke bidang lain. - Atribut kelas
arityditambahkan keFunc. Atribut ini dapat digunakan untuk menyetel sejumlah argumen fungis penerimaan. - Ditambahkan
BigAutoFieldyang bertindak seperti sebuah pengecualianAutoFieldyang di jaminkan untuk mencocokkan angka dari1sampai9223372036854775807. QuerySet.in_bulk()mungkin dipanggil tanpa argumen apapun untuk mengembalikan semua obyek di queryset.related_query_namesekarang mendukung label aplikasi dan penyisipan kelas menggunakan deretan karakter'%(app_label)s'dan'%(class)s'.- Diizinkan mengutamakan bidang model diwariskan dari kelas-kelas berdasarkan abstrak.
- Fungsi
prefetch_related_objects()sekarang APU umum. QuerySet.bulk_create()menyetel primary key pada obyek ketika menggunakan PostgreSQL.- Ditambahkan fungsi basisdata
Cast. - Sebuah model proxy mungkin sekarang mewarisi banyak model proxy yang berbagi kelas induk bukan-abstrak umum.
- Ditambahkan fungsi-fungsi
Extractuntuk mengambil komponen-komponen datetime sebagai integer, seperti tahun dan jam. - Ditambahkan fungsi-fungsi
Truncutnuk memotong tanggal atau datetime pada komponen penting. Mereka mengadakan permintaan seperti penjualan-per-hari atau penjualan-per-jam. Model.__init__()sekarang menyetel nilai dari bidang maya dari argumen kata kuncinya.- Pilihan
Meta.base_manager_namedanMeta.default_manager_namebaru mengizinkan mengendalikan_base_managerdan_default_manager, masing-masing.
Permintaan dan Tanggapan¶
- Ditambahkan
request.userpada tampilan mencai kesalahan. - Ditambahkan metode
HttpResponsereadable()danseekable()untuk membuat sebuah contoh obyek seperti-arus dan mengizinkan membungkusnya denganio.TextIOWrapper. - Ditambahkan atribut
HttpRequest.content_typedancontent_paramsyang diuraikan dari kepalaCONTENT_TYPE. - Pengurai untuk
request.COOKIESdisederhanakan untuk perilaku pencocokan lebih baik dari perambanrequest.COOKIESsekarang mengandung kue yang tidak sah menurut RFC 6265 tetapi memunginkan menyetel melaluidocument.cookie.
Serialisasi¶
django.core.serializers.json.DjangoJSONEncodersekarang mengetahui bagaimana menserialisasikan deretan karakter lazy, khususnya digunakan untuk isi terjemahan.
Templat¶
- Ditambahkan pilihan
autoescapepada backendDjangoTemplatesdan kelasEngine. - Ditambahkan penghubung perbandingan
isdanis notpada etiketif. - Diizinkan
dictsortuntuk 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
extendsdaninclude.
Pengujian¶
- Untuk penangkapan kesalahan lebih baik,
TestCasesekarang memeriksa batasan basisdata dapat ditunda pada akhir setiap percobaan. - Percobaan dan kasus percobaan dapat di marked with tags dan dijalankan dipilih-pilih dengan pilihan
test --tagdantest --exclude-tagbaru. - Anda sekarang dapat masuk dan menggunakan sesi dengan klien percobaan bahkan jika
django.contrib.sessionstidak diINSTALLED_APPS.
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 mengambilFORCE_SCRIPT_NAMEkedalam akun ketiks dia disetel.
Pengesah¶
URLValidatorsekarang 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 pilihanallow_negativeparameter boolean, nilai awal keFalse, 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¶
AreaFieldGIS menggunakan jenis numerik dasar tidak ditentukan yang dapat dalam praktiknya menjadi jenis Python numerik apapun. Nilaidecimal.Decimaldiambil dari basisdata sekarang dirubah menjadifloatuntuk membuatnya lebih mudah memadukan mereka dengan nilai-nilai digunakan oleh pustaka GIS.- Untuk mengadakan pengurangan sementara anda harus menyetel bendera fitur basisdata
supports_temporal_subtractionmenjadiTruedan menerapkan metodeDatabaseOperations.subtract_temporals(). Cara ini harus mengembalikan SQL dan parameter yang dibutuhkan untuk menghitung perbedaan dalam mikrodetik diantara argumenlhsdanrhsdi jenis data digunakan untuk menyimpanDurationField.
_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()untukdjango.contrib.gis.utils.add_srs_entry()dipindahkan. - Pada Oracle/GIS, fungsi pengumpulan
Areasekarang mengembalikanfloatdaripadadecimal.Decimal. (Itu masih dibungkus dalam ukuran meter persegi.) - Perwakilan
GEOSGeometryawal (keluaran WKT) dipangkas secara awal. Yaitu, daripadaPOINT (23.0000000000000000 5.5000000000000000), anda akan mendapatkanPOINT (23 5.5).
Ukuran maksimum dari permintaan badan dan angka dari parameter GET/POST dibatasi¶
Dua pengaturan baru membantu mengurangi serangan denial-of-service melalui permintaan besar:
DATA_UPLOAD_MAX_MEMORY_SIZEmembatasi ukuran yang permintaan badan mungkin. Unggah berkas tidak menghitung menuju batasan ini.DATA_UPLOAD_MAX_NUMBER_FIELDSmembatasi angka dari parameter GET/POST yang diuraikan.
Aplikasi yang menerima penempatan formulir tidak biasanya besar mungkin butuh merubah pengaturan ini.
Bermacam-macam¶
repr()dariQuerySetdibungkus 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_URLdipindahkan 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 keHttpResponsesekarang ditutup segera sebagai gantinya ketika peladen WSGI memanggilclose()pada tanggapan. - Memanggil
transaction.atomic()berlebihan dalamQuerySet.update_or_create()dipindahkan. Ini mungkin mempengaruhi permintaan perhitungan dicoba olehTransactionTestCase.assertNumQueries(). - Dukungan untuk
skip_validationdiBaseCommand.execute(**options)dipindahkan. Gunakanskip_checks(ditambahkan di Django 1.7) sebagai gantinya. loaddatasekarang memunculkan sebuahCommandErrorsebagai gantinya dari menampilkan sebuah peringatan ketika berkas peralatan tetap ditentukan tidak ditemukan.- Daripada secara langsung mengakses atribut
LogEntry.change_message, sekarang lebih baik memanggil metodeLogEntry.get_change_message()yang akan menyediakan pesan di bahasa saat ini. - Tampilan kesalahan awal sekarang menampilkan
TemplateDoesNotExistjikatemplate_nametidak ada ditentukan. - Argumen kata kunci
choicestidak digunakan dari widgetsSelectdanSelectMultiplemetoderender()dipindahkan. Argumenchoicesdari metoderender_options()juga dipindahkan, membuatselected_choicesargumen 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 contohoptions['verbosity'], daripadaoptions.get()dan tidak lagi melakukan jenis paksaan apapun. Ini dapat menjadi sebuah masalah jika anda sedang memanggil perintah menggunakanCommand.execute()(yang melewatkan pengurai argumen yang menyetel nilai awalan) daripadacall_command(). Daripada memanggilCommand.execute(), lewati obyek perintah sebagai argumen pertama untukcall_command(). ModelBackenddanRemoteUserBackendsekarang menolak pengguna tidak aktif. Ini berarti bahwa pengguna tidak aktif tidak dapat masuk dan akan keluar jika mereka diganti dariis_active=TruemenjadiFalse. Jika anda butuh perilaku sebelumnya, gunakanAllowAllUsersModelBackendatauAllowAllUsersRemoteUserBackenddiAUTHENTICATION_BACKENDSsebagai 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_fielddariRangeFieldsekarang jenis dari bidang, bukan sebuah instance dari bidang. Jika anda telah membuat subkelas penyesuaian dariRangeField, anda harus merubah atributbase_field. - Kelas-kelas middleware sekarang diinisialisasikan ketika peladen mulai daripada selama permintaan pertama.
- Jika anda menimpa
is_authenticated()atauis_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 atributModelAdmin.save_as_continuebaru menjadiFalse. - Bidang-bidang formulir diwajibkan sekarang mempunyai atribut HTML
required. Setel atributForm.use_required_attributemenjadiFalseuntuk meniadakannya. Anda dapat juga menambah atributnovalidatepada<form>jika anda tidak ingin pengesahan peramban. Untuk meniadakan atributrequiredpada widget penyesuaian, menimpa metodeWidget.use_required_attribute(). - Penangan WSGI tidak lagi memindahkan isi dari tanggapan dari permintaan
HEADatau tanggapan denganstatus_codedari 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 menerimadjango.db.models.DEFERREDsebagai nilai dari bidang-bidang yang ditangguhkan.- Atribut
Model._deferreddpindahkan sebagai kelas-kelas model dinamis ketika menggunakanQuerySet.defer()danonly()dipindahkan. Storage.save()tidak lagi mengganti'\'dengan'/'. Perilaku ini dipindahkan keFileSystemStoragesejak ini adalah rincian penerapan penyimpanan khusus. Tiap pengguna Windows dengan penerapan penyimpanan penyesuaian yang mengandalkan pada perilaku ini akan butuh menerapkannya di metodesave()penyimpanan penyesuaian.- Metode
FileFieldpribadiget_directory_name()danget_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, timpaFileField.generate_filename()atauStorage.generate_filename()sebagai gantinya. Itu dapat memungkinkan menggunakanupload_tojuga. - Subjek dari surel dikirim oleh
AdminEmailHandlertidak lagi dipotong pada karakter 989. Jika anda menghitung pada batasan panjang, potong subjek anda sendiri. - Pernyataan pribadi
django.db.models.expressions.DatedanDateTimedipindahkan. PernyataanTruncbaru menyediakan kegunaan sama. - Atribut
_base_managerdan_default_managerdipindahkan 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
AbstractBaseUserdan menimpaclean(), pastikan itu memanggilsuper().AbstractBaseUser.normalize_username()dipanggil di metodeAbstractBaseUser.clean()baru. - API pribadi
django.forms.models.model_to_dict()mengembalikan sebuah queryset daripada sebuah daftar dari primary key untukManyToManyField. - Jika
django.contrib.staticfilesdipasang, etiket cetakanstaticmenggunakan penyimpananstaticfilesuntuk membangun URL daripada cukup menggabungkan nilai denganSTATIC_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_L10NadalahTrue, lokalisasi sekarang berlaku untuk penyaringdatedantimeketika tidak ada bentuk string ditentukan. PenentuDATE_FORMATdanTIME_FORMATdari 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()danset_srid()dariGEOSGeometrydiusangkan dalam mendukung dari miliksrid. - Metode
get_x(),set_x(),get_y(),set_y(),get_z(), danset_z()dariPointdiusangkan dalam mendukung dari milikx,y, danz. - Metode
get_coords()danset_coords()dariPointdiusangkan dalam mendukung dari miliktuple. cascaded_unionmilik dariMultiPolygondiusangkan dalam mendukung dari milikunary_union.- Fungsi
django.contrib.gis.utils.precision_wkt()diusangkan dalam mendukung dariWKTWriter.
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 --exitdiusangkan dalam mendukung dari pilihanmakemigrations --check. django.utils.functional.allow_lazy()diusangkan dalam mendukung dari fungsikeep_lazy()baru yang dapat digunakan dengan sintaksis penghias alami.- Pilihan
shell --plaindiusangkan dalam mendukung dari-i pythonatau--interface python. - Mengimpor dari modul
django.core.urlresolversdiusangkan dalam mendukung dari tempat barunya,django.urls. - Metode
Context.has_key()cetakan diusangkan dalam mendukungin. - Atribut pribadi
virtual_fieldsdariModel._metadiusangkan dalam mendukung dariprivate_fields. - Argumen kata kunci pribadi
virtual_onlydiField.contribute_to_class()danvirtualdiModel._meta.add_field()diusangkan dalam mendukung dariprivate_onlydanprivate, masing-masing. - Tampilan
javascript_catalog()danjson_catalog()diusangkan dalam mendukung dari tampilan berdasarkan-kelasJavaScriptCatalogdanJSONCatalog. - Di warisan banyak-tabel, promosi tersirat dari
OneToOneFieldkeparent_linkdiusangkan. Tambahparent_link=Trueuntuk bidang tersebut. - API pribadi
Widget._format_value()dibuat umum dan dinamai kembali menjadiformat_value(). Nama lama akan bekerja sampai masa pengusangan. - Metode
FileFieldpribadiget_directory_name()danget_filename()diusangkan dalam mendukung dari penampilan pekerjaan ini diStorage.generate_filename()). - Middleware gaya-lama yang menggunakan
settings.MIDDLEWARE_CLASSESdiusangkan. Adapt old, custom middleware dan menggunakan pengaturanMIDDLEWAREbaru.
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
SQLCompilersecara langsung sebagai sebuah nama lain untuk memanggil metodequote_name_unless_aliasnya dipindahkan. - Etiket cetakan
cycledanfirstofdipindahkan dari pustaka etiket cetakanfuture. django.conf.urls.patterns()dipindahkan.- Dukungan untuk argumen
prefixpadadjango.conf.urls.i18n.i18n_patterns()dipindahkan. SimpleTestCase.urlsdipindahkan.- Menggunakan perhitungan salah dari nilai dibuka di etiket cetakan
formemunculkan sebuah pengecualian daripada gagal diam-diam. - Kemampuan untuk
reverse()URL menggunakan jalur Python bertitik dipindahkan. - Kemampuan menggunakan jalur Python bertitik untuk pengaturan
LOGIN_URLdanLOGIN_REDIRECT_URLdipindahkan. - Dukungan untuk
optparsedibuang untuk perintah pengelolaan penyesuaian. - Kelas
django.core.management.NoArgsCommanddipindahkan. - Modul
django.core.context_processorsdipindahkan. - Modul
django.db.models.sql.aggregatesdipindahkan. - Modul
django.contrib.gis.db.models.sql.aggregatesdipindahkan. - Metode dan milik berikut dari
django.db.sql.query.Querydipindahkan:- Milik:
aggregatesdanaggregate_select - Metode:
add_aggregate,set_aggregate_mask, danappend_aggregate_mask.
- Milik:
django.template.resolve_variabledipindahkan.- 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_messagedaridjango.forms.RegexFielddipindahkan. - Penyaring
unordered_listtidak mendukung lagi daftar gaya lama. - Dukungan untuk deretan karakter argumen
viewpadaurl()dipindahkan. - Shim kesesuaian kebelakang untuk menamai kembali
django.forms.Form._has_changed()padahas_changed()dipindahkan. - Penyaring cetakan
removetagsdipindahkan. - Fungsi
remove_tags()danstrip_entities()didjango.utils.htmldipindahkan. - Argumen
is_admin_sitepadadjango.contrib.auth.views.password_reset()dipindahkan. django.db.models.field.subclassing.SubfieldBasedipindahkan.django.utils.checksumsdipindahkan.- Atribut
original_content_type_idpadadjango.contrib.admin.helpers.InlineAdminFormdipindahkan. - Shim kesesuaian kebelakang mengizinkan
FormMixin.get_form()untuk ditentukan dengan nilai tidak ada awalan untuk argumenform_classnya dipindahkan. - Pengaturan berikut telah dihapus, anda harus ubah menjadi pengaturan
TEMPLATES:ALLOWED_INCLUDE_ROOTSTEMPLATE_CONTEXT_PROCESSORSTEMPLATE_DEBUGTEMPLATE_DIRSTEMPLATE_LOADERSTEMPLATE_STRING_IF_INVALID
- Nama lain kesesuaian kebelakang
django.template.loader.BaseLoaderdipindahkan. - Obyek cetakan Django dikembalikan oleh
get_template()danselect_template()tidak lagi menerima sebuahContextdi metoderender()mereka. - Template response APIs memaksa penggunaan dari
dictdan obyek cetakan tergantung-backend daripada masing-masingContextdanTemplate. - Parameter
current_appuntuk fungsi dan kelas-kelas berikut dipindahkan:django.shortcuts.render()django.template.Context()django.template.RequestContext()django.template.response.TemplateResponse()
- Parameter
dictionarydancontext_instanceuntuk fungsi berikut dipindahkan:django.shortcuts.render()django.shortcuts.render_to_response()django.template.loader.render_to_string()
- Parameter
dirsuntuk 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'diMIDDLEWARE_CLASSES.SessionAuthenticationMiddlewaretidak lagi mempunyai tujuan apapun dan dapat dipindahkan dariMIDDLEWARE_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.relateddipindahkan. - Pilihan
--listdari perintah pengelolaanmigratedipindahkan. - Etiket cetakan
ssidipindahkan. - Mendukung untuk penghubung perbandingan
=di etiket cetakanifdipindahkan. - Shim kesesuaian kebelakang mengizinkan
Storage.get_available_name()danStorage.save()untuk ditentukan tanpa sebuah argumenmax_lengthdipindahkan. - Dukungan untuk warisan sintaksis
%(<foo>)sdiModelFormMixin.success_urldipindahkan. GeoQuerySetkumpulan metodecollect(),extent(),extent3d(),make_line(), danunionagg()dipindahkan.- Kemampuan untuk menentukan
ContentType.nameketika membuat instance jenis isi dipindahkan. - Dukungan untuk tandatangan lama dari
allow_migratedipindahkan. - Dukungan untuk sintaksis
{% cycle %}yang menggunakan argumen dipisah-koma dipindahkan. - Peringatan yang
Signermuncul ketika pemisah tidak sah yang diberikan sekarang menjadi sebuah pengecualian.