Menghubungkan aplikasi anda dari Django 0.96 ke 1.0Link to this heading
Django 1.0 memutus kesesuaian dengan 0.96 di beberapa kawasan.
Panduan ini akan membantu anda menghubungkan proyek 0.96 dan apliaksi ke 1.0. Bagian pertama dari dokumen ini termasuk perubahan umum dibutuhkan untuk berjalan dengan 1.0. Jika setelah melalui bagian pertama kode anda masih rusak, periksa bagian Less-common Changes untuk daftar ikatan masalah kesesuaian yang kurang umum.
Perubahan umumLink to this heading
Bagian ini menggambarkan perubahan diantara 0.96 dan 1.0 yang paling pengguna butuhkan untuk dibuat.
Gunakan UnicodeLink to this heading
Merubah harfiah deretan karakter ('foo') menjadi harfiah Unicode (u'foo'). Django sekarang menggunakan deretan karakter Unicode seluruhnya. Di kebanyakan tempat, deretan karakter mentah akan lanjut bekerja, tetapi memperbaharui untuk menggunakan harfiah Unicode akan mencegah pengaburan beberapa masalah.
Lihat Data Unicode untuk rincian penuh.
ModelLink to this heading
Perubahan umum ke berkas model anda:
Namai kembali maxlength ke max_lengthLink to this heading
Namai kembali argumen maxlength anda ke max_length (ini dirubah agar selaras dengan bidang-bidang formulir):
Ganti __str__ dengan __unicode__Link to this heading
Ganti fungsi __str__ model anda dengan metode __unicode__, dan pastikan anda use Unicode (u'foo') di metode itu.
Pindahkan prepopulated_fromLink to this heading
Pindahkan argumen prepopulated_from pada bidang model. Itu tidak lagi sah dan telah dipindahkan ke kelas ModelAdmin di admin.py. Lihat the admin, dibawah ini, untuk rincian lebih tentang dirubah ke admin.
Pindahkan coreLink to this heading
Pindahkan argumen core dari bidang model anda. itu tidak lagi dibutuhkan, sejak kegunaan yang setara (bagian dari inline editing) ditangani dengan berbeda oleh antarmuka admin sekarang. Anda tidak harus khawatir tentang penyuntingan berderet sampai anda menuju bagian the admin, dibawah. Untuk sekarang, pindahkan semua acuan ke core.
Ganti class Admin: dengan admin.pyLink to this heading
Pindahkan semua pernyataan class Admin sebelah dalam dari model anda. Mereka tidak merusak apapun jika anda meninggalkan mereka, tetapi mereka juga tidak akan melakukan apapun. Untuk mendaftarkan aplikasi dengan admin anda akan pindahkan pernyataan itu ke berkas admin.py; lihat the admin dibawah untuk lebih rinci.
ContohLink to this heading
DIbawah ini adalah sebuah contoh berkas models.py dengan semua perubahan anda ingin buat:
Lama (0.96) models.py:
class Author(models.Model):
first_name = models.CharField(maxlength=30)
last_name = models.CharField(maxlength=30)
slug = models.CharField(maxlength=60, prepopulate_from=('first_name', 'last_name'))
class Admin:
list_display = ['first_name', 'last_name']
def __str__(self):
return '%s %s' % (self.first_name, self.last_name)
Baru (1.0) models.py:
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
slug = models.CharField(max_length=60)
def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
Baru (1.0) admin.py:
from django.contrib import admin
from models import Author
class AuthorAdmin(admin.ModelAdmin):
list_display = ['first_name', 'last_name']
prepopulated_fields = {
'slug': ('first_name', 'last_name')
}
admin.site.register(Author, AuthorAdmin)
AdminLink to this heading
Satu dari perubahan terbesar di 1.0 adalah admin baru. Antarmuka administratif Django (django.contrib.admin) telah sepenuhnya di refaktor; pengertian admin sekarang sepenuhnya dipisahkan dari pengertian model, kerangka kerja telah ditulis kembali untuk menggunakan pustaka penanganan formulir baru Django dan dirancang kembali dengan perpanjangan dan penyesuaian dalam pikiran.
Practically, this means you'll need to rewrite all of your class Admin
declarations. You've already seen in models above how to replace your class
Admin with an admin.site.register() call in an admin.py file. Below are
some more details on how to rewrite that Admin declaration into the new
syntax.
Gunakan sintaksis berderet yang baruLink to this heading
Pilihan edit_inline baru semua telah dipindahkan ke admin.py. Ini adalah contoh:
Lama (0.96):
class Parent(models.Model):
...
class Child(models.Model):
parent = models.ForeignKey(Parent, edit_inline=models.STACKED, num_in_admin=3)
Baru (1.0):
class ChildInline(admin.StackedInline):
model = Child
extra = 3
class ParentAdmin(admin.ModelAdmin):
model = Parent
inlines = [ChildInline]
admin.site.register(Parent, ParentAdmin)
Lihat Obyek InlineModelAdmin untuk rinci.
Sederhanakan fields, atau gunakan fieldsetsLink to this heading
Sintaksis fields lama sangat membingungkan, dan telah disederhanakan. Sintaksis lama masih bekerja, tetapi anda akan butuh menggunakan fieldsets sebagai gantinya.
Lama (0.96):
class ModelOne(models.Model):
...
class Admin:
fields = (
(None, {'fields': ('foo','bar')}),
)
class ModelTwo(models.Model):
...
class Admin:
fields = (
('group1', {'fields': ('foo','bar'), 'classes': 'collapse'}),
('group2', {'fields': ('spam','eggs'), 'classes': 'collapse wide'}),
)
Baru (1.0):
class ModelOneAdmin(admin.ModelAdmin):
fields = ('foo', 'bar')
class ModelTwoAdmin(admin.ModelAdmin):
fieldsets = (
('group1', {'fields': ('foo','bar'), 'classes': 'collapse'}),
('group2', {'fields': ('spam','eggs'), 'classes': 'collapse wide'}),
)
URLLink to this heading
Perbaharui akar urls.py anda.Link to this heading
Jika anda menggunakan situs admin, anda butuh memperbaharui akar urls.py anda.
Lama (0.96) urls.py:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^admin/', include('django.contrib.admin.urls')),
# ... the rest of your URLs here ...
)
Baru (1.0) urls.py:
from django.conf.urls.defaults import *
# The next two lines enable the admin and load each admin.py file:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/(.*)', admin.site.root),
# ... the rest of your URLs here ...
)
ViewLink to this heading
Gunakan django.forms sebagai gantinya newformsLink to this heading
Ganti django.newforms dengan django.forms -- Django 1.0 dinamai kembali modul newforms (diperkenalkan di 0.96) untuk forms lama kosong. Modul oldforms juga dipindahkan.
Jika anda sudah menggunakan pustaka newforms, dan anda menggunakan anjuran kami sintaksis pernyataan import, semua anda harus lakukan adalah merubah pernyataan impor anda.
Lama:
from django import newforms as forms
Baru:
from django import forms
Jika anda sedang menggunakan sistem formulir lama (dahulu dikenal sebagai django.forms dan django.oldforms), anda akan harus menuli skembali formulir anda. Tempat bagus untuk memulai adalah forms documentation
Menangani berkas terunggah menggunakan API baruLink to this heading
Rubah penggunaan berkas-berkas terunggah -- yaitu, masukan di request.FILES -- sebagai kamus sederhana dengan UploadedFile baru. Sintaksis kamus lama tidak lagi bekerja.
Jadi, dalam tampilan seperti:
def my_view(request):
f = request.FILES['file_field_name']
...
...anda butuh membuat perubahan berikut:
Lama (0.96) |
Baru (1.0) |
|---|---|
|
|
|
|
|
|
Bekerja dengan bidang berkas menggunakan API baruLink to this heading
Penerapan internal dari django.db.models.FileField telah berubah. Hasil nampak dari ini adalah bahwa cara anda mengakses atribut khusus (URL, berkas nama, ukuran gambar, dll.) dari bidang model ini telah berubah. Anda akan butuh membuat perubahan berikut, menganggap FileField model anda dipanggil myfile:
Lama (0.96) |
Baru (1.0) |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Catat bahwa atribut width dan height hanya masuk akal untuk bidang ImageField. Rincian lebih dapat ditemukan di dokumentasi model API.
Gunakan Paginator daripada ObjectPaginatorLink to this heading
ObjectPaginator di 0.96 telah dipindahkan dan diganti dengan versi diperbaiki, django.core.paginator.Paginator.
TemplatLink to this heading
Belajar mencintai pelolosan otomatisLink to this heading
Secara awal, sistem cetakan sekarang otomatis meloloskan HTML keluaran setiap variabel. Untuk mempelajari lebih, lihat Pelolosan HTML otomatis.
Untuk meniadakan pelolosan otomatis untuk variabel tersendiri, gunakan safe filter:
This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}
Untuk meniadakan pelolosan otomatis untuk keseluruhan cetakan, bungkus cetakan (atau cukup bagian tertentu dari cetakan) di etiket autoescape:
{% autoescape off %}
... unescaped template content here ...
{% endautoescape %}
Perubahan kurang umumLink to this heading
Perubahan berikut lebih kecil, lebih perubahan lokal. Mereka hanya berpengaruh lebih pengguna lanjutan, tetapi itu mungkin bernilai baik membaca melalui daftar dan memeriksa kode anda untuk hal-hal ini.
SinyalLink to this heading
Tambah
**kwargspada setiap penangan sinyal terdaftar.Hubungkan, putuskan, dan kirim sinyal melalui metode pada obyek
Signaldaripada melalui modul metode didjango.dispatch.dispatcher.Pindahkan tiap penggunaan pilihan pengirim
AnonymousdanAny; mereka tidak lagi ada. Anda masih dapat menerima sinyal dikirim oleh pengirim dengan menggunakansender=NoneBuat sinyal penyesuaian apa saja anda telah nyatakan kedalam instance dari
django.dispatch.Signalsebagai ganti dari obyek anonim.
Berikut rekap dari perubahan kode yang perlu anda lakukan:
Lama (0.96) |
Baru (1.0) |
|---|---|
|
|
|
|
|
|
|
|
|
|
Rasa lokalLink to this heading
Rasa lokal U.SLink to this heading
django.contrib.localflavor.usa telah dinamai kembali ke django.contrib.localflavor.us. Perubahan ini dibuat untuk mencocokan penamaan skema dari rasa lokal lainnya. Untuk memindahkan kode anda, anda yang butuh lakukan adalah merubah impor.
SesiLink to this heading
Mendapatkan kunci sesi baruLink to this heading
SessionBase.get_new_session_key() telah dinamai kembali menjadi _get_new_session_key(). get_new_session_object() tidak lagi ada.
PerlengkapanLink to this heading
Memuat sebuah baris yang tidak memanggil save()Link to this heading
Sebelumnya, memuat sebuah baris secara otomatis menjalankan metode save() model. Ini bukan lagi kasus, jadi tiap bidang (sebagai contoh: timestamp) yang dikumpulkan otomatis oleh save() sekarang butuh nilai eksplisit di tiap perlengkapan tetap.
PengaturanLink to this heading
Pengecualian terbaikLink to this heading
EnvironmentError lama telah dipisah menjadi ImportError ketika Django gagal menemukan modul pengaturan dan RuntimeError ketika anda mencoba mengkonfigurasi kembali pengaturan setelah selesai menggunakan mereka.
LOGIN_URL telah dipindahkanLink to this heading
Ketetapan LOGIN_URL dipindah dari django.contrib.auth kedalam modul settings. Daripada menggunakan from django.contrib.auth import LOGIN_URL mengacu pada settings.LOGIN_URL.
Perilaku APPEND_SLASH telah diperbaharuiLink to this heading
Di 0.96, jika sebuah URL tidak berakhir di garis miring atau mempunyai titik di akhir komponen dari jalurnya, dan APPEND_SLASH adalah True, Django akan mengalihkan ke URL sama, tetapi dengan tanda miring ditambahkan pada akhir. Sekarang, Django memeriksa apakah pola tanpa ekor garis miring akan cocok oleh sesuatu di pola URL anda. Jika demikian, tidak ada pengalihan, karena itu dianggap anda sengaja ingin menangkap pola itu.
Untuk kebanyakan orang, ini tidak akan membutuhkan perubahan. Beberapa orang, meskipun, mempunyai pola URL yang terlihat seperti ini:
r'/some_prefix/(.*)$'
Sebelumnya, pola itu akan dialihkan untuk mempunyai sebuah ekor garis miring. Jika anda selalu ingin garis miring pada URL itu, tulis kembali pola sebagai:
r'/some_prefix/(.*/)$'
Perubahan model kecilLink to this heading
Pengecualian berbeda dari get()Link to this heading
Pengelola sekarang mengembalikan pengecualian MultipleObjectsReturned daripada AssertionError:
Lama (0.96):
try:
Model.objects.get(...)
except AssertionError:
handle_the_error()
Baru (1.0):
try:
Model.objects.get(...)
except Model.MultipleObjectsReturned:
handle_the_error()
LazyDate telah dinyalakanLink to this heading
Kelas pembantu LazyDate tidak lagi ada.
Nilai bidang awalan dan permintaan argumen keduanya obyek callable, jadi instance dari LazyDate dapat diganti dengan acuan pada datetime.datetime.now:
Lama (0.96):
class Article(models.Model):
title = models.CharField(maxlength=100)
published = models.DateField(default=LazyDate())
Baru (1.0):
import datetime
class Article(models.Model):
title = models.CharField(max_length=100)
published = models.DateField(default=datetime.datetime.now)
DecimalField adalah baru, dan FloatField sekarang float tepat.Link to this heading
Lama (0.96):
class MyModel(models.Model):
field_name = models.FloatField(max_digits=10, decimal_places=3)
...
Baru (1.0):
class MyModel(models.Model):
field_name = models.DecimalField(max_digits=10, decimal_places=3)
...
Jika anda lupa membuat perubahan ini, anda akan melihat kesalahan tentang FloatField bukan mengambil atribut max_digits di __init__, karena FloatField baru mengambil argumen terkait tidak teliti.
Jika anda sedang menggunakan MySQL atau PostgreSQL, tidak dibtuuhkan perubahan lebih lanjut. Jenis kolom basisdata untuk DecimalField adalah sama untuk FloatField lama.
Jika anda menggunakan SQLite, anda butuh memaksa basisdata melihat kolom yang sesuai sebagai jenis desimal, daripada float. untuk melakukan ini, anda akan butuh memuat kembali data anda. Lakukam ini setelah anda membuat perubahan untuk menggunakan DecimalField di kode anda dan kode Django diperbaharui.
Untuk meningkatkan setiap aplikasi untuk menggunakan sebuah DecimalField, anda dapat melakukan berikut, mengganti <app> di kode dibawah ini dengan setiap nama aplikasi:
$ ./manage.py dumpdata --format=xml <app> > data-dump.xml
$ ./manage.py reset <app>
$ ./manage.py loaddata data-dump.xml
Catatan:
Itu sangat penting bahwa anda mengingat untuk menggunakan bentuk XML dalam langkah pertama dari pengolahan ini. Kami sedang menggunakan fitur dari data buangan XML yang membuat belokan float ke desimal dengan SQLite memungkinkan.
In the second step you will be asked to confirm that you are prepared to lose the data for the application(s) in question. Say yes; we'll restore this data in the third step.
DecimalFieldtidak digunakan di tiap aplikasi yang dibekali dengan Django sebelum perubahan ini dibuat, jadi anda tidak butuh khawatir tentang melakukan prosedur ini untuk tiap model Django standar.
Jika sesuatu berjalan salah di pengolahan diatas, cukup salin berkas basisdata sokongan anda terhadap berkas asli dan mulai kembali.
InternasionalisasiLink to this heading
django.views.i18n.set_language() sekarang membutuhkan permintaan POSTLink to this heading
Sebelumnya, permintaan GET telah digunakan. Perilaku lama berarti bahwa keadaan (lokal digunakan untuk menampilkan situs) dapat berubah dengan permintaan GET, yaitu terhadap anjuran spesifikasi HTTP. Kode memanggil tampilan ini harus memastikan bahwa permintaan POST sekaragn dibuat, sebagai gantinya GET. Ini berarti anda tidak dapat lagi menggunakan tautan mengakses tampilan, tetapi harus menggunakan pengajuan formulir dari sejenis (sebagai contoh tombol).
_() tidak lagi siap pakaiLink to this heading
_() (obyek callable yang namanya adalah garis bawah tunggal) tidak lagi monkeypatch kedalam siap pakai -- yaitu, itu tidak lagi tersedia secara ajaib di setiap modul.
Jika anda sebelumnya bergantung pada _() selalu menjadi hadir, anda harus sekarang secara eksplisit mengimpor ugettext atau ugettext_lazy, jika sesuai, dan namai itu menjadi _ anda sendiri:
from django.utils.translation import ugettext as _
Obyek HTTP request/responseLink to this heading
Akses kamus ke HttpRequestLink to this heading
Obyek HttpRequest tidak lagi langsung mendukung akses gaya kamus; sebelumnya, kedua data GET dan POST langsung tersedia pada obyek HttpRequest (sebagai contoh, anda dapat memeriksa untuk potongan dari formulir data dengan menggunakan if 'some_form_key' in request atau dengan membaca request['some_form_key']. Ini tidak lagi didukung; jika anda butuh akses untuk mengkombinasikan data GET dan POST, gunakan request.REQUEST sebagai gantinya.
Itu sangat disarankan, bagaimanapun, bahwa anda selalu secara eksplisit mencari di kamus yang sesuai untuk jenis dari permintaan anda harapkan untuk menerima (request.GET or request.POST); bergantung pada gabungan kamus request.REQUEST dapat menutup data datang asli.
Mengakses kepala HTTPResponseLink to this heading
django.http.HttpResponse.headers telah dinamai kembali ke _headers dan HttpResponse sekarang mendukung penahanan pemeriksaan secara langsung. Jadi gunakan if header in response: daripada if header in response.headers:.
Hubungan umumLink to this heading
Hubungan umum telah dipindahkan keluar dari intiLink to this heading
Kelas-kelas hubungan umum -- GenericForeignKey dan GenericRelation -- telah dipindahkan kedalam modul django.contrib.contenttypes.
PengujianLink to this heading
meth:django.test.Client.login telah berubahLink to this heading
Lama (0.96):
from django.test import Client
c = Client()
c.login('/path/to/login','myuser','mypassword')
Baru (1.0):
# ... same as above, but then:
c.login(username='myuser', password='mypassword')
Pengelolaan perintahLink to this heading
Menjalankan pengelolaan perintah dari kode andaLink to this heading
django.core.management telah direfaktor.
Panggilan pada pengelolaan pelayanan di kode anda sekarang butuh untuk menggunakan call_command. Sebagai contoh, jika anda mempunyai beberapa percobaan yang memanggil flush dan load_data:
from django.core import management
management.flush(verbosity=0, interactive=False)
management.load_data(['test_data'], verbosity=0)
...anda akan butuh merubah kdoe ini untuk dibaca:
from django.core import management
management.call_command('flush', verbosity=0, interactive=False)
management.call_command('loaddata', 'test_data', verbosity=0)
Sub perintah sekarang harus mendahulukan pilihanLink to this heading
django-admin.py dan manage.py sekarang membutuhkan sub perintah untuk mendahulukan pilihan. Jadi:
$ django-admin.py --settings=foo.bar runserver
...tidak lagi bekerja dan harus dirubah menjadi:
$ django-admin.py runserver --settings=foo.bar
Struktur dataLink to this heading
SortedDictFromList` telah pergiLink to this heading
django.newforms.forms.SortedDictFromList telah dipindahkan. django.utils.datastructures.SortedDict sekarang dapat membuat obyek dengan urutan dari tuple-tuple.
Untuk memperbaharui kode anda:
Gunakan
django.utils.datastructures.SortedDictdimanapun anda menggunakandjango.newforms.forms.SortedDictFromList.Karena
django.utils.datastructures.SortedDict.copytidak mengemblikan salinan dalam sebagaiSortedDictFromList.copy()lakukan, anda akan butuh memperbaharui kode anda jika anda bergantung pada saliann dalam. Lakukan ini dengan menggunakancopy.deepcopysecara langsung.
Fungsi basisdata backendLink to this heading
Fungsi basisdata backend telah diubah namanyaLink to this heading
Hampir semua dari fungsi tingkatan backend basisdata telah dinamai kembali dan/atau ditempatkan kembali. Tidak ada dari ini didokumentasikan, tetapi anda akan butuh merubah kode anda jika anda sedang menggunakan tiap fungsi ini, semua dari yang berada di django.db:
Lama (0.96) |
Baru (1.0) |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
connection.ops.fulltext_search_sql` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KomentarLink to this heading#
Jika anda menggunakan aplikasi
django.contrib.commentsDjango 0.96, anda akan btuuh meningkatkan ke aplikasi komentar baru diperkenalkan di 1.0. Lihat panduan peningkatan untuk rincian.