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.
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.
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
.
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.
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
.
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
¶Distance lookups sekarang menerima pernyataan sebagai jarak parameter nilai.
Harta GEOSGeometry.unary_union
baru menghitung gabungan dari semua unsur dari geometri ini.
Ditambahkan sebutan biner GEOSGeometry.covers()
.
Ditambahkan metode GDALBand.statistics()
dan atribut mean
dan std
.
Ditambahkan dukungan untuk pengumpulan fungsi MakeLine
dan GeoHash
pada SpatiaLite.
Ditambahkan dukungan untuk fungsi Difference
, Intersection
, dan SymDifference
pada MySQL.
Ditambahkan dukungan untuk instantisi geometri GEOS kosong.
Harta trim
dan precision
baru dari WKTWriter
mengizinkan mengendalikan keluaran dari bagian pecahan dari kordinat di WKT.
Ditambahkan harta LineString.closed
dan MultiLineString.closed
.
GeoJSON serializer sekarang mengeluarkan primary key dari obyek di kamus properties
jika bidang tertentu tidak ditetapkan.
Kemampuan melipat data masukan pada metode GDALBand.data()
telah ditambahkan. Pita data sekarang dapat diperbaharui dengan nilai berulang secara efisien.
Ditambahkan fungsi basisdata IsValid
dan MakeValid
, sama halnya seperti pencarian isvalid
, semua untuk PostGIS. Ini mengizinkan menyaring dan memperbaiki geometri tidak sah pada sisi basisdata.
Ditambahkan dukungan raster untuk semua spatial lookups.
django.contrib.postgres
¶Untuk meyakinkan, HStoreField
sekarang memberikan kunci dan nilainya ke deretan karakter.
django.contrib.sessions
¶Perintah pengelolaan clearsessions
sekarang memindahkan sesi berdasarkan-berkas.
django.contrib.sites
¶Model Site
sekarang mendukung natural keys.
django.contrib.staticfiles
¶Etiket cetakan static
sekarang menggunakan django.contrib.staticfiles
jika itu didalam INSTALLED_APPS
. Ini khususnya berguna untuk aplikasi pihak ketiga yang dapat sekarang selalu menggunakan {% load static %}
(sebagai gantinya dari {% load staticfiles %}
atau {% load static from staticfiles %}
) dan tidak khawatir tentang apakah atau tidak aplikasi staticfiles
terpasang.
Anda dapat more easily customize pilihan collectstatic --ignore_patterns
dengan AppConfig
penyesuaian.
Backend tembolok berdasarkan-berkas sekarang menggunakan protokol pengasaman tertinggi.
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).
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.
Backend penyimpanan sekarang menghadirkan API sadar-zona waktu dengan metode baru get_accessed_time()
, get_created_time()
, dan get_modified_time()
. Mereka mengembalikan datetime
waspada zona waktu jika USE_TZ
adalah True
dan datetime
tidak dibuat-buat di zona waktu lokal jikalau tidak.
Metode Storage.generate_filename()
baru membuatnya semakin mudah untuk menerapkan penyimpanan penyesuaian yang tidak menggunakan os.path
memanggil sebelumnya di FileField
.
Formulir 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.
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
.
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.
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.
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.
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
.
django.core.serializers.json.DjangoJSONEncoder
sekarang mengetahui bagaimana menserialisasikan deretan karakter lazy, khususnya digunakan untuk isi terjemahan.
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
.
Untuk penangkapan kesalahan lebih baik, TestCase
sekarang memeriksa batasan basisdata dapat ditunda pada akhir setiap percobaan.
Percobaan dan kasus percobaan dapat di marked with tags dan dijalankan dipilih-pilih dengan pilihan test --tag
dan test --exclude-tag
baru.
Anda sekarang dapat masuk dan menggunakan sesi dengan klien percobaan bahkan jika django.contrib.sessions
tidak di INSTALLED_APPS
.
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.
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.
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.
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)
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.
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,
}
}
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.
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()
.
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.
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)
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)
.
Dua pengaturan baru membantu mengurangi serangan denial-of-service melalui permintaan besar:
DATA_UPLOAD_MAX_MEMORY_SIZE
membatasi ukuran yang permintaan badan mungkin. Unggah berkas tidak menghitung menuju batasan ini.
DATA_UPLOAD_MAX_NUMBER_FIELDS
membatasi angka dari parameter GET/POST yang diuraikan.
Aplikasi yang menerima penempatan formulir tidak biasanya besar mungkin butuh merubah pengaturan ini.
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.
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.
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
.
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)
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:
...
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.
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 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.
Apr 04, 2017