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 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.
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 menghalangi pada daftar perubahan model akan sekarang dibangun (tanpa tombol tambah, tentunya). Ini membuat itu lebih mudah menambahkan alat penyesuaian dalam kasus ini.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 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').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 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.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 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¶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_selectadd_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_ROOTSTEMPLATE_CONTEXT_PROCESSORSTEMPLATE_DEBUGTEMPLATE_DIRSTEMPLATE_LOADERSTEMPLATE_STRING_IF_INVALIDdjango.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.Mar 30, 2019