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 How to upgrade Django to a newer version 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 to
solve the lack of strict request/response layering of the old-style of
middleware described in DEP 0005.
You'll need to adapt old, custom middleware and
switch from the MIDDLEWARE_CLASSES
setting to the new MIDDLEWARE
setting to take advantage of the improvements.
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.
Validator username saat ini menerima karakter Unicode secara default hanya di Python 3.
Penyesuaian model user mungkin menggunakan ASCIIUsernameValidator
atau UnicodeUsernameValidator
.
django.contrib.admin
¶URL awal untuk tautan "View site"
pada atas dari setiap halaman admin akan sekarang menunjuk ke request.META['SCRIPT_NAME']
jika disetel, daripada /
.Content-Security-Policy
jika anda ingin.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.object-tools
block on a
model's changelist will now be rendered (without the add button). This makes
it easier to add custom tools in this case.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.ModelAdmin.raw_id_fields
sekarang mempunyai sebuah tautan ke formulir rubah obyek.DateFieldListFilter
jika bidang adalah nullable.django.contrib.auth
¶django.contrib.auth.hashers.PBKDF2PasswordHasher
untuk merubah nilai awal.django.contrib.auth.views.logout()
mengirim kepala "no-cache" untuk mencegah sebuah masalah dimana cache Safari pengalihan dan mencegah seorang pengguna menjadi dapat keluar.backend
pada django.contrib.auth.login()
untuk menggunakan itu tanpa without surat pengenal.LOGOUT_REDIRECT_URL
baru mengendalikan pengalihan dari tampilan logout()
, jika tampilan tidak mendapatkan argumen next_page
.redirect_authenticated_user
baru untuk tampilan django.contrib.auth.views.login()
mengizinkan pengalihan pengguna terautentifikasi 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
¶GEOSGeometry.unary_union
baru menghitung gabungan dari semua unsur dari geometri ini.GEOSGeometry.covers()
.GDALBand.statistics()
dan atribut mean
dan std
.MakeLine
dan GeoHash
pada SpatiaLite.Difference
, Intersection
, dan SymDifference
pada MySQL.trim
dan precision
baru dari WKTWriter
mengizinkan mengendalikan keluaran dari bagian pecahan dari kordinat di WKT.LineString.closed
dan MultiLineString.closed
.properties
jika bidang tertentu tidak ditetapkan.GDALBand.data()
telah ditambahkan. Pita data sekarang dapat diperbaharui dengan nilai berulang secara efisien.IsValid
dan MakeValid
, sama halnya seperti pencarian isvalid
, semua untuk PostGIS. Ini mengizinkan menyaring dan memperbaiki geometri tidak sah pada sisi basisdata.django.contrib.postgres
¶HStoreField
sekarang memberikan kunci dan nilainya ke deretan karakter.django.contrib.sessions
¶clearsessions
sekarang memindahkan sesi berdasarkan-berkas.django.contrib.sites
¶Site
sekarang mendukung natural keys.django.contrib.staticfiles
¶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.collectstatic --ignore
dengan AppConfig
penyesuaian.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.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()
.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.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.Storage.generate_filename()
baru membuatnya semakin mudah untuk menerapkan penyimpanan penyesuaian yang tidak menggunakan os.path
memanggil sebelumnya di FileField
.Media
sekarang dilayani menggunakan django.contrib.staticfiles
jika terpasang.<input>
dibangun oleh CharField
sekarang menyertakan atribut minlength
jika bidang mempunyai min_length
.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.i18n_patterns()
sekrang dapat digunakan di akar URLConf ditentukan menggunakan request.urlconf
.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
.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()
.check --fail-level
baru mengizinkan menentukan tingkatan pesan yang akan menyebabkan perintah keluar dengan keadaan bukan nol.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.shell --interface
sekarang menerima python
untuk memaksa menggunakan penafsir Python plain
.shell --command
baru membiarkan anda menjalankan perintah sebagai Django dan keluar, daripada membuka shell interaktif.dumpdata
jka model proxy ditentukan (yang menghasilkan tidak ada keluaran) tanpa wujud induknya.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.call_command()
sekarang menerima obyek perintah sebagai argumen pertama.shell
mendukung penyelesaian label pada sistem menggunakan libedit
, misalnya macOS.inspectdb
membiarkan anda memilih tabel apa harus diperiksa dengan menentukan nama-nama mereka sebagai argumen.enum.Enum
.elidable
pada tindakan RunSQL
dan RunPython
untuk mengizinkan mereka dipindahkan ketika melumat perpindahan.atomic
pada Migration
.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.pre_migrate()
dan post_migrate()
sekarang mengirim perpindahan plan
dan apps
mereka.ForeignKey
menunjuk ke model proxy sekarang tersedia sebagai penjelasan pada kelas model yang di proxy kan dan mungkin diacukan di penyaring queryset.Field.rel_db_type()
baru mengembalikan jenis data basisdata untuk bidang seperti ForeignKey
dan OneToOneField
yang menunjuk ke bidang lain.arity
ditambahkan ke Func
. Atribut ini dapat digunakan untuk menyetel sejumlah argumen fungis penerimaan.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'
.prefetch_related_objects()
sekarang APU umum.QuerySet.bulk_create()
menyetel primary key pada obyek ketika menggunakan PostgreSQL.Cast
.Extract
untuk mengambil komponen-komponen datetime sebagai integer, seperti tahun dan jam.Trunc
untuk 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.Meta.base_manager_name
dan Meta.default_manager_name
baru mengizinkan mengendalikan _base_manager
dan _default_manager
, masing-masing.request.user
pada tampilan mencai kesalahan.HttpResponse
readable()
dan seekable()
untuk membuat sebuah contoh obyek seperti-arus dan mengizinkan membungkusnya dengan io.TextIOWrapper
.HttpRequest.content_type
dan content_params
yang diuraikan dari kepala CONTENT_TYPE
.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.autoescape
pada backend DjangoTemplates
dan kelas Engine
.is
dan is not
pada etiket if
.dictsort
untuk mengurutkan daftar dari daftar oleh unsur pada indeks yang ditentukan.debug()
mengandung permintaan untuk semua nama lain basisdata daripada hanya nama lain awalan.extends
dan include
.TestCase
sekarang memeriksa batasan basisdata dapat ditunda pada akhir setiap percobaan.test --tag
dan test --exclude-tag
baru.django.contrib.sessions
tidak di INSTALLED_APPS
.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.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.
The apps registry is no longer auto-populated when unpickling models. This was
added in Django 1.7.2 as an attempt to allow unpickling models outside of
Django, such as in an RQ worker, without calling django.setup()
, but it
creates the possibility of a deadlock. To adapt your code in the case of RQ,
you can provide your own worker script
that calls 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
¶add_postgis_srs()
untuk django.contrib.gis.utils.add_srs_entry()
dipindahkan.Area
sekarang mengembalikan float
daripada decimal.Decimal
. (Itu masih dibungkus dalam ukuran meter persegi.)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
limits the size that a request body
may be. File uploads don't count toward this limit.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').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/'
.close()
seperti berkas dan pembangkit dilewatkan ke HttpResponse
sekarang ditutup segera sebagai gantinya ketika peladen WSGI memanggil close()
pada tanggapan.transaction.atomic()
berlebihan dalam QuerySet.update_or_create()
dipindahkan. Ini mungkin mempengaruhi permintaan perhitungan dicoba oleh TransactionTestCase.assertNumQueries()
.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.LogEntry.change_message
, sekarang lebih baik memanggil metode LogEntry.get_change_message()
yang akan menyediakan pesan di bahasa saat ini.TemplateDoesNotExist
jika template_name
tidak ada ditentukan.choices
tidak digunakan dari widgets Select
dan SelectMultiple
metode render()
dipindahkan. Argumen choices
dari metode render_options()
juga dipindahkan, membuat selected_choices
argumen pertama.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.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.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
.is_authenticated()
atau is_anonymous()
dalam model pengguna penyesuaian, anda harus merubah mereka ke atribut atau sifat seperti digambarkan di the deprecation note.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
.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()
.HEAD
requests or responses with a status_code
of 100-199, 204, or 304. Most
web servers already implement this behavior. Responses retrieved using the
Django test client continue to have these "response fixes" applied.Model.__init__()
sekarang menerima django.db.models.DEFERRED
sebagai nilai dari bidang-bidang yang ditangguhkan.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.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.AdminEmailHandler
tidak lagi dipotong pada karakter 989. Jika anda menghitung pada batasan panjang, potong subjek anda sendiri.django.db.models.expressions.Date
dan DateTime
dipindahkan. Pernyataan Trunc
baru menyediakan kegunaan sama._base_manager
dan _default_manager
dipindahkan dari instance model. Mereka tetap dapat diakses pada kelas model.AttributeError
.AbstractBaseUser
dan menimpa clean()
, pastikan itu memanggil super()
. AbstractBaseUser.normalize_username()
dipanggil di metode AbstractBaseUser.clean()
baru.django.forms.models.model_to_dict()
mengembalikan sebuah queryset daripada sebuah daftar dari primary key untuk ManyToManyField
.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
.USE_L10N
is True
, localization is now applied for the
date
and time
filters when no format string is
specified. The DATE_FORMAT
and TIME_FORMAT
specifiers from the active
locale are used instead of the settings of the same name.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
¶get_srid()
dan set_srid()
dari GEOSGeometry
diusangkan dalam mendukung dari milik srid
.get_x()
, set_x()
, get_y()
, set_y()
, get_z()
, dan set_z()
dari Point
diusangkan dalam mendukung dari milik x
, y
, dan z
.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
.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.
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.shell --plain
diusangkan dalam mendukung dari -i python
atau --interface python
.django.core.urlresolvers
diusangkan dalam mendukung dari tempat barunya, django.urls
.Context.has_key()
cetakan diusangkan dalam mendukung in
.virtual_fields
dari Model._meta
diusangkan dalam mendukung dari private_fields
.virtual_only
di Field.contribute_to_class()
dan virtual
di Model._meta.add_field()
diusangkan dalam mendukung dari private_only
dan private
, masing-masing.javascript_catalog()
dan json_catalog()
diusangkan dalam mendukung dari tampilan berdasarkan-kelas JavaScriptCatalog
dan JSONCatalog
.OneToOneField
ke parent_link
diusangkan. Tambah parent_link=True
untuk bidang tersebut.Widget._format_value()
dibuat umum dan dinamai kembali menjadi format_value()
. Nama lama akan bekerja sampai masa pengusangan.FileField
pribadi get_directory_name()
dan get_filename()
diusangkan dalam mendukung dari penampilan pekerjaan ini di Storage.generate_filename()
).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.
SQLCompiler
secara langsung sebagai sebuah nama lain untuk memanggil metode quote_name_unless_alias
nya dipindahkan.cycle
dan firstof
dipindahkan dari pustaka etiket cetakan future
.django.conf.urls.patterns()
dipindahkan.prefix
pada django.conf.urls.i18n.i18n_patterns()
dipindahkan.SimpleTestCase.urls
dipindahkan.for
memunculkan sebuah pengecualian daripada gagal diam-diam.reverse()
URL menggunakan jalur Python bertitik dipindahkan.LOGIN_URL
dan LOGIN_REDIRECT_URL
dipindahkan.optparse
dibuang untuk perintah pengelolaan penyesuaian.django.core.management.NoArgsCommand
dipindahkan.django.core.context_processors
dipindahkan.django.db.models.sql.aggregates
dipindahkan.django.contrib.gis.db.models.sql.aggregates
dipindahkan.django.db.sql.query.Query
dipindahkan:aggregates
dan aggregate_select
add_aggregate
, set_aggregate_mask
, dan append_aggregate_mask
.django.template.resolve_variable
dipindahkan.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()
error_message
dari django.forms.RegexField
dipindahkan.unordered_list
tidak mendukung lagi daftar gaya lama.view
pada url()
dipindahkan.django.forms.Form._has_changed()
pada has_changed()
dipindahkan.removetags
dipindahkan.remove_tags()
dan strip_entities()
di django.utils.html
dipindahkan.is_admin_site
pada django.contrib.auth.views.password_reset()
dipindahkan.django.db.models.field.subclassing.SubfieldBase
dipindahkan.django.utils.checksums
dipindahkan.original_content_type_id
pada django.contrib.admin.helpers.InlineAdminForm
dipindahkan.FormMixin.get_form()
untuk ditentukan dengan nilai tidak ada awalan untuk argumen form_class
nya dipindahkan.TEMPLATES
:ALLOWED_INCLUDE_ROOTS
TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_DEBUG
TEMPLATE_DIRS
TEMPLATE_LOADERS
TEMPLATE_STRING_IF_INVALID
django.template.loader.BaseLoader
dipindahkan.get_template()
dan select_template()
tidak lagi menerima sebuah Context
di metode render()
mereka.dict
dan obyek cetakan tergantung-backend daripada masing-masing Context
dan Template
.current_app
untuk fungsi dan kelas-kelas berikut dipindahkan:django.shortcuts.render()
django.template.Context()
django.template.RequestContext()
django.template.response.TemplateResponse()
dictionary
dan context_instance
untuk fungsi berikut dipindahkan:django.shortcuts.render()
django.shortcuts.render_to_response()
django.template.loader.render_to_string()
dirs
untuk fungsi berikut dipindahkan:django.template.loader.get_template()
django.template.loader.select_template()
django.shortcuts.render()
django.shortcuts.render_to_response()
'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.django.db.models.Field.related
dipindahkan.--list
dari perintah pengelolaan migrate
dipindahkan.ssi
dipindahkan.=
di etiket cetakan if
dipindahkan.Storage.get_available_name()
dan Storage.save()
untuk ditentukan tanpa sebuah argumen max_length
dipindahkan.%(<foo>)s
di ModelFormMixin.success_url
dipindahkan.GeoQuerySet
kumpulan metode collect()
, extent()
, extent3d()
, make_line()
, dan unionagg()
dipindahkan.ContentType.name
ketika membuat instance jenis isi dipindahkan.allow_migrate
dipindahkan.{% cycle %}
yang menggunakan argumen dipisah-koma dipindahkan.Signer
muncul ketika pemisah tidak sah yang diberikan sekarang menjadi sebuah pengecualian.Agu 03, 2022