読者です 読者をやめる 読者になる 読者になる

Django 0.97preで作ったアプリを 1.0beta1 で動かすためにやったこと

Django Python

互換性の無い変更はここらへんを参考に。
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

http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#Movedfilter_interfacefromthemodeldefinition

モデルで定義しないで、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

http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#RemovedvalidatemethodsforModelandModelfieldclasses

これが一番大きいかな。
モデルのフィールドに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)