正規表現とか重複とかハマったとことかのメモ
forms.py
from hoge.models import User import re class CreateProfileForm(forms.ModelForm): checkbox = forms.CharField(label=u'規約に同意する', widget=forms.CheckboxInput()) class Meta: model = User fields = ('name',) def clean_name(self): name = self.cleaned_data['name'] #if re.match(r'^[a-zA-Z0-9_-]+$', name) is None: if not re.match(r'^[\w-]+$', name): raise forms.ValidationError(u'半角英数字、_、-しかだめよ') if User.objects.filter(name=name).count(): raise forms.ValidationError(u'重複する名前があります') return name
re.matchには is をつかう
== でやっててハマった。
[2011/08/10 23:23:31] @ttttttt : 1. re.matchはMatchObjectかNoneしか返さない。
だから、マッチするかどうかはif re.match(r"pattern", "文字列") という風に、is Noneとかを条件には普通しない。 (-> JavaScriptでも条件分岐でわざわざ foo == undefined とか使わないよね?)
filter(hoge=hoge).count()で重複をとってくる
User.object.get(hoge=hoge)しててハマった。*1
追記
[2011/08/10 23:23:53] tttttttttt: 2. Djangoのフォームには正規表現を引数に取るRegexFieldがあるから、それを素直に使った方がコードがすっきり収まる。forms.Form.clean_何々 とかで敢えて正規表現にマッチするかどうかの条件分岐を書く必要は無い。
RegexFieldについては知らなかったです。初耳。この場合はformをcleanしたかったので素直にdef clean_hoge しました。
thx
@xxxxx ++
@yyyyyy ++
@zzzzzz ++
*1:Userはmodels.pyで定義してあるclass