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-Policy
jika anda ingin. - Atribut
InlineModelAdmin.classes
baru mengizinkan menetapkan kelas-kelas pada deretam kumpulan bidang. Berderet dengan kelascollapse
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. MetodeLogEntry.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 padalogin()
untuk mengizinkan menggunakannya tanpa surat kepercayaan. - Pengaturan
LOGOUT_REDIRECT_URL
baru mengendalikan pengalihan dari tampilanlogout()
, jika tampilan tidak mendapatkan argumennext_page
. - Parameter
redirect_authenticated_user
baru untuk tampilanlogin()
mengizinkan pengalihan otentifikasi pengguna mengunjungi halaman masuk. AllowAllUsersModelBackend
danAllowAllUsersRemoteUserBackend
baru mengabaikan nilai dariUser.is_active
, selagiModelBackend
danRemoteUserBackend
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 atributmean
danstd
. - Ditambahkan dukungan untuk pengumpulan fungsi
MakeLine
danGeoHash
pada SpatiaLite. - Ditambahkan dukungan untuk fungsi
Difference
,Intersection
, danSymDifference
pada MySQL. - Ditambahkan dukungan untuk instantisi geometri GEOS kosong.
- Harta
trim
danprecision
baru dariWKTWriter
mengizinkan mengendalikan keluaran dari bagian pecahan dari kordinat di WKT. - Ditambahkan harta
LineString.closed
danMultiLineString.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
danMakeValid
, 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,
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 menggunakandjango.contrib.staticfiles
jika 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 aplikasistaticfiles
terpasang. - Anda dapat more easily customize 1 pilihan
collectstatic --ignore
denganAppConfig
penyesuaian.
Tembolok¶
- Backend tembolok berdasarkan-berkas sekarang menggunakan protokol pengasaman tertinggi.
CSRF¶
CSRF_FAILURE_VIEW
awal,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=True
dan 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_joiner
dan**extra_context
dariFunc.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 mengembalikandatetime
waspada zona waktu jikaUSE_TZ
adalahTrue
dandatetime
tidak dibuat-buat di zona waktu lokal jikalau tidak. - Metode
Storage.generate_filename()
baru membuatnya semakin mudah untuk menerapkan penyimpanan penyesuaian yang tidak menggunakanos.path
memanggil sebelumnya diFileField
.
Formulir¶
- Formulir dan widget
Media
sekarang dilayani menggunakandjango.contrib.staticfiles
jika terpasang. - Etiket
<input>
dibangun olehCharField
sekarang menyertakan atributminlength
jika bidang mempunyaimin_length
. - Bidang formulir yang diwajibkan sekarang mempunyai atribut HTML
required
. Setel atributForm.use_required_attribute
baru menjadiFalse
untuk meniadakannya. Atributrequired
tidak 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_language
baru 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 parameternext
diPOST
atauGET
.- Tampilan berdasarkan kelas
JavaScriptCatalog
danJSONCatalog
menggantikan 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 terjemahandjangojs
dari semua aplikasi terpasang daripada hanya deretan karakter JavaScript dariLOCALE_PATHS
.
Pengelolaan perintah¶
call_command()
sekarang mengembalikan nilai dikembalikan dari metodecommand.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 menerimapython
untuk memaksa menggunakan penafsir Pythonplain
. - 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 menjadiTrue
jika anda ingin perintah anda mencetak peringatan, sepertirunserver
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 menggunakanlibedit
, misalnya macOS. - Perintah
inspectdb
membiarkan anda memilih tabel apa harus diperiksa dengan menentukan nama-nama mereka sebagai argumen.
Perpindahan¶
- Ditambahkan dukungan untuk serialisasi dari obyek
enum.Enum
. - Ditambahkan argumen
elidable
pada tindakanRunSQL
danRunPython
untuk mengizinkan mereka dipindahkan ketika melumat perpindahan. - Ditambahkan dukungan untuk non-atomic migrations dengan mengatur atribut
atomic
padaMigration
. - Perintah
migrate
danmakemigrations
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()
danpost_migrate()
sekarang mengirim perpindahanplan
danapps
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 sepertiForeignKey
danOneToOneField
yang menunjuk ke bidang lain. - Atribut kelas
arity
ditambahkan keFunc
. Atribut ini dapat digunakan untuk menyetel sejumlah argumen fungis penerimaan. - Ditambahkan
BigAutoField
yang bertindak seperti sebuah pengecualianAutoField
yang di jaminkan untuk mencocokkan angka dari1
sampai9223372036854775807
. QuerySet.in_bulk()
mungkin dipanggil tanpa argumen apapun untuk mengembalikan semua obyek di queryset.related_query_name
sekarang mendukung label aplikasi dan penyisipan kelas menggunakan deretan karakter'%(app_label)s'
dan'%(class)s'
.- Diizinkan mengutamakan bidang model diwariskan dari kelas-kelas berdasarkan abstrak.
- Fungsi
prefetch_related_objects()
sekarang APU umum. QuerySet.bulk_create()
menyetel primary key pada obyek ketika menggunakan PostgreSQL.- Ditambahkan fungsi basisdata
Cast
. - Sebuah model proxy mungkin sekarang mewarisi banyak model proxy yang berbagi kelas induk bukan-abstrak umum.
- Ditambahkan fungsi-fungsi
Extract
untuk mengambil komponen-komponen datetime sebagai integer, seperti tahun dan jam. - Ditambahkan fungsi-fungsi
Trunc
utnuk memotong tanggal atau datetime pada komponen penting. Mereka mengadakan permintaan seperti penjualan-per-hari atau penjualan-per-jam. Model.__init__()
sekarang menyetel nilai dari bidang maya dari argumen kata kuncinya.- Pilihan
Meta.base_manager_name
danMeta.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()
danseekable()
untuk membuat sebuah contoh obyek seperti-arus dan mengizinkan membungkusnya denganio.TextIOWrapper
. - Ditambahkan atribut
HttpRequest.content_type
dancontent_params
yang diuraikan dari kepalaCONTENT_TYPE
. - Pengurai untuk
request.COOKIES
disederhanakan untuk perilaku pencocokan lebih baik dari perambanrequest.COOKIES
sekarang mengandung kue yang tidak sah menurut RFC 6265 tetapi memunginkan menyetel melaluidocument.cookie
.
Serialisasi¶
django.core.serializers.json.DjangoJSONEncoder
sekarang mengetahui bagaimana menserialisasikan deretan karakter lazy, khususnya digunakan untuk isi terjemahan.
Templat¶
- Ditambahkan pilihan
autoescape
pada backendDjangoTemplates
dan kelasEngine
. - Ditambahkan penghubung perbandingan
is
danis not
pada etiketif
. - 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
daninclude
.
Pengujian¶
- Untuk penangkapan kesalahan lebih baik,
TestCase
sekarang memeriksa batasan basisdata dapat ditunda pada akhir setiap percobaan. - Percobaan dan kasus percobaan dapat di marked with tags dan dijalankan dipilih-pilih dengan pilihan
test --tag
dantest --exclude-tag
baru. - Anda sekarang dapat masuk dan menggunakan sesi dengan klien percobaan bahkan jika
django.contrib.sessions
tidak 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_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 pilihanallow_negative
parameter 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¶
AreaField
GIS menggunakan jenis numerik dasar tidak ditentukan yang dapat dalam praktiknya menjadi jenis Python numerik apapun. Nilaidecimal.Decimal
diambil dari basisdata sekarang dirubah menjadifloat
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
menjadiTrue
dan menerapkan metodeDatabaseOperations.subtract_temporals()
. Cara ini harus mengembalikan SQL dan parameter yang dibutuhkan untuk menghitung perbedaan dalam mikrodetik diantara argumenlhs
danrhs
di 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
Area
sekarang mengembalikanfloat
daripadadecimal.Decimal
. (Itu masih dibungkus dalam ukuran meter persegi.) - Perwakilan
GEOSGeometry
awal (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_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.
Bermacam-macam¶
repr()
dariQuerySet
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 keHttpResponse
sekarang 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_validation
diBaseCommand.execute(**options)
dipindahkan. Gunakanskip_checks
(ditambahkan di Django 1.7) sebagai gantinya. loaddata
sekarang memunculkan sebuahCommandError
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 metodeLogEntry.get_change_message()
yang akan menyediakan pesan di bahasa saat ini. - Tampilan kesalahan awal sekarang menampilkan
TemplateDoesNotExist
jikatemplate_name
tidak ada ditentukan. - Argumen kata kunci
choices
tidak digunakan dari widgetsSelect
danSelectMultiple
metoderender()
dipindahkan. Argumenchoices
dari metoderender_options()
juga dipindahkan, membuatselected_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 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()
. ModelBackend
danRemoteUserBackend
sekarang menolak pengguna tidak aktif. Ini berarti bahwa pengguna tidak aktif tidak dapat masuk dan akan keluar jika mereka diganti dariis_active=True
menjadiFalse
. Jika anda butuh perilaku sebelumnya, gunakanAllowAllUsersModelBackend
atauAllowAllUsersRemoteUserBackend
diAUTHENTICATION_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
dariRangeField
sekarang 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_continue
baru menjadiFalse
. - Bidang-bidang formulir diwajibkan sekarang mempunyai atribut HTML
required
. Setel atributForm.use_required_attribute
menjadiFalse
untuk meniadakannya. Anda dapat juga menambah atributnovalidate
pada<form>
jika anda tidak ingin pengesahan peramban. Untuk meniadakan atributrequired
pada widget penyesuaian, menimpa metodeWidget.use_required_attribute()
. - Penangan WSGI tidak lagi memindahkan isi dari tanggapan dari permintaan
HEAD
atau tanggapan denganstatus_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 menerimadjango.db.models.DEFERRED
sebagai nilai dari bidang-bidang yang ditangguhkan.- Atribut
Model._deferred
dpindahkan sebagai kelas-kelas model dinamis ketika menggunakanQuerySet.defer()
danonly()
dipindahkan. Storage.save()
tidak lagi mengganti'\'
dengan'/'
. Perilaku ini dipindahkan keFileSystemStorage
sejak 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
FileField
pribadiget_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_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
danDateTime
dipindahkan. PernyataanTrunc
baru menyediakan kegunaan sama. - Atribut
_base_manager
dan_default_manager
dipindahkan dari instance model. Mereka tetap dapat diakses pada kelas model. - Mengakses bidang terhapus pada instance model, sebagai contoh setelah del obj.field`, muat kembali nilai bidang daripada memunculkan
AttributeError
. - Jika anda subkelas
AbstractBaseUser
dan 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.staticfiles
dipasang, etiket cetakanstatic
menggunakan penyimpananstaticfiles
untuk 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_L10N
adalahTrue
, lokalisasi sekarang berlaku untuk penyaringdate
dantime
ketika tidak ada bentuk string ditentukan. PenentuDATE_FORMAT
danTIME_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()
danset_srid()
dariGEOSGeometry
diusangkan dalam mendukung dari miliksrid
. - Metode
get_x()
,set_x()
,get_y()
,set_y()
,get_z()
, danset_z()
dariPoint
diusangkan dalam mendukung dari milikx
,y
, danz
. - Metode
get_coords()
danset_coords()
dariPoint
diusangkan dalam mendukung dari miliktuple
. cascaded_union
milik dariMultiPolygon
diusangkan 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 --exit
diusangkan 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 --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 mendukungin
. - Atribut pribadi
virtual_fields
dariModel._meta
diusangkan dalam mendukung dariprivate_fields
. - Argumen kata kunci pribadi
virtual_only
diField.contribute_to_class()
danvirtual
diModel._meta.add_field()
diusangkan dalam mendukung dariprivate_only
danprivate
, masing-masing. - Tampilan
javascript_catalog()
danjson_catalog()
diusangkan dalam mendukung dari tampilan berdasarkan-kelasJavaScriptCatalog
danJSONCatalog
. - Di warisan banyak-tabel, promosi tersirat dari
OneToOneField
keparent_link
diusangkan. Tambahparent_link=True
untuk bidang tersebut. - API pribadi
Widget._format_value()
dibuat umum dan dinamai kembali menjadiformat_value()
. Nama lama akan bekerja sampai masa pengusangan. - Metode
FileField
pribadiget_directory_name()
danget_filename()
diusangkan dalam mendukung dari penampilan pekerjaan ini diStorage.generate_filename()
). - Middleware gaya-lama yang menggunakan
settings.MIDDLEWARE_CLASSES
diusangkan. Adapt old, custom middleware dan menggunakan pengaturanMIDDLEWARE
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 metodequote_name_unless_alias
nya dipindahkan. - Etiket cetakan
cycle
danfirstof
dipindahkan dari pustaka etiket cetakanfuture
. django.conf.urls.patterns()
dipindahkan.- Dukungan untuk argumen
prefix
padadjango.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
danLOGIN_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
danaggregate_select
- Metode:
add_aggregate
,set_aggregate_mask
, danappend_aggregate_mask
.
- Milik:
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
daridjango.forms.RegexField
dipindahkan. - Penyaring
unordered_list
tidak mendukung lagi daftar gaya lama. - Dukungan untuk deretan karakter argumen
view
padaurl()
dipindahkan. - Shim kesesuaian kebelakang untuk menamai kembali
django.forms.Form._has_changed()
padahas_changed()
dipindahkan. - Penyaring cetakan
removetags
dipindahkan. - Fungsi
remove_tags()
danstrip_entities()
didjango.utils.html
dipindahkan. - Argumen
is_admin_site
padadjango.contrib.auth.views.password_reset()
dipindahkan. django.db.models.field.subclassing.SubfieldBase
dipindahkan.django.utils.checksums
dipindahkan.- Atribut
original_content_type_id
padadjango.contrib.admin.helpers.InlineAdminForm
dipindahkan. - Shim kesesuaian kebelakang mengizinkan
FormMixin.get_form()
untuk ditentukan dengan nilai tidak ada awalan untuk argumenform_class
nya dipindahkan. - Pengaturan berikut telah dihapus, anda harus ubah menjadi pengaturan
TEMPLATES
:ALLOWED_INCLUDE_ROOTS
TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_DEBUG
TEMPLATE_DIRS
TEMPLATE_LOADERS
TEMPLATE_STRING_IF_INVALID
- Nama lain kesesuaian kebelakang
django.template.loader.BaseLoader
dipindahkan. - Obyek cetakan Django dikembalikan oleh
get_template()
danselect_template()
tidak lagi menerima sebuahContext
di metoderender()
mereka. - Template response APIs memaksa penggunaan dari
dict
dan obyek cetakan tergantung-backend daripada masing-masingContext
danTemplate
. - 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
dancontext_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'
diMIDDLEWARE_CLASSES
.SessionAuthenticationMiddleware
tidak 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.related
dipindahkan. - Pilihan
--list
dari perintah pengelolaanmigrate
dipindahkan. - Etiket cetakan
ssi
dipindahkan. - Mendukung untuk penghubung perbandingan
=
di etiket cetakanif
dipindahkan. - Shim kesesuaian kebelakang mengizinkan
Storage.get_available_name()
danStorage.save()
untuk ditentukan tanpa sebuah argumenmax_length
dipindahkan. - Dukungan untuk warisan sintaksis
%(<foo>)s
diModelFormMixin.success_url
dipindahkan. GeoQuerySet
kumpulan metodecollect()
,extent()
,extent3d()
,make_line()
, danunionagg()
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.