djangoforms における validation

0.96 と 1.0 を行き来するのは大変。とりあえず clean を使いましょう。

# vim: fileencoding=utf8

import re

from google.appengine.api import users
from google.appengine.ext.db import djangoforms

try:
  from django import newforms as forms
except ImportError:
  from django import forms

from models import Account, Status

class AccountNameField(forms.CharField):
  _RE_ACCOUNT_NAME = re.compile(r'^[a-zA-Z0-9_]{3,16}$')
  def clean(self, value):
    if not self._RE_ACCOUNT_NAME.search(value):
      raise forms.ValidationError, u'アカウント名に使用できない文字が含まれています'
    if Account.all().filter('account_name =', value).get():
      raise forms.ValidationError, u'アカウント名は既に使用されています'
    return value

class AccountForm(djangoforms.ModelForm):
  account_name = AccountNameField()
  user = djangoforms.UserProperty().get_form_field(initial=None, label='Email')
  class Meta:
    model = Account
    exclude = ['user', 'created', 'timeline', 'followings']