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

正規表現とか重複とかハマったとことかのメモ

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

広告を非表示にする