Django 0.97preで作ったアプリを 1.0beta1 で動かすためにやったこと
互換性の無い変更はここらへんを参考に。
http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges
newforms-admin のマージ
http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#Mergednewforms-adminintotrunk
http://www.djangoproject.com/documentation/admin/
- models.pyから、class Admin定義をadmin.pyに移動。
- urls.pyで、admin画面の定義を変更。
#admin.py from django.contrib import admin from myproject.myapp.models import Hoge class HogeAdmin(admin.ModelAdmin): pass admin.site.register(Hoge, HogeAdmin)
# urls.py from django.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', ('^admin/(.*)', admin.site.root), )
RemovedLazyDate
http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#RemovedLazyDate
モデル定義のデフォルト値に、呼び出し可能オブジェクトを指定できるようになった。
おかげで作成日時を記録するためだけにsaveメソッドをオーバーライドする必要がなくなった。
#models.py from datetime import datetime from django.db import models class Hoge(models.Model): modified = models.DateTimeField(u'更新日時', default=datetime.now)
dispatcherがdeprecated
http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#Signalrefactoring
変わりにdjango.db.models.signalsを使う。
# -*- encoding: utf-8 -*- from django.db import models from django.db.models import signals from myproject.myapp.models import Hoge def post_aved(signal, sender, instance, **kwds): pass signals.post_save.connect(receiver=post_saved, sender=Hoge)
filter_interface
モデルで定義しないで、ModelAdminに定義する。
#admin.py # -*- encoding: utf-8 -*- from django.contrib import admin from myproject.myapp.models import Hoge class AuthorAdmin(admin.ModelAdmin): filter_horizontal = ('field1', 'field2') admin.site.register(Hoge, HogeAdmin)
validator_list
これが一番大きいかな。
モデルのフィールドにvalidator_listを定義しても、全くバリデートされなくなった。
チケット6845の解決を待つしかないわけだけど、post-1.0まで延期されてしまった。とりあえずnewformsでバリデーションして回避するしかないみたい。
自作のnewformsをadminサイトで使いたいなら、ModelAdminで指定してあげればいい。
#forms.py # -*- encoding: utf-8 -*- from django.forms import ModelForm, ValidationError from myproject.myapp.models import Hoge class HogeForm(ModelForm): class Meta: model = Hoge def clean_field1(self): #特定のフィールドに対してバリデートしたい場合 cleaned = self.cleaned_data['field1'] #バリデーション if not valid: raise ValidationError(u'バリデーションエラー') return cleaned def clean(self): #複数のフィールドに対してバリデートしたい場合 cleaned_field1 = self.cleaned_data['field1'] cleaned_field2 = self.cleaned_data['field2'] #バリデーション if not valid: raise ValidationError(u'バリデーションエラー') return self.cleaned_data
#admin.py # -*- encoding: utf-8 -*- from django.contrib import admin from myproject.myapp.models import Hoge from myproject.myapp.forms import HogeForm class HogeAdmin(admin.ModelAdmin): form = HogeForm admin.site.register(Hoge, HogeAdmin)