ユーザー登録で悩んでみる

チュートリアルも無事に終わったので
一番使いそうな機能、ユーザー登録を作ってみたいと思います。
フォームとフィールド,マニピュレータ : Django オンラインドキュメント和訳

ここで説明しているフォーム/マニピュレータシステムは,次の Django リリース では別のシステムに置き換えられる予定です.スクラッチで新たなアプリケーショ ンを開発するつもりなら,このシステムを学ぶために時間を浪費しないよう強く勧 めます.その代わりに,新たなフォームシステムである django.newforms の使 い方を学んで利用しましょう. newforms のドキュメント は現在整備中です.

http://michilu.com/django/doc-ja/forms/

と書いてありますので newforms を使ってみたいと思います。


まず、forms.py を書いてみる。

# -*- encoding: utf-8 -*-
from django import newforms as forms

class UserRegistrationForm( forms.Form ):
    """ユーザー登録用フォーム
    
    """

    username = forms.CharField( 
        required = True,
        max_length = 30,
        label = 'UserName' )
    
    password = forms.CharField(
        required = True,
        max_length = 128,
        widget = forms.PasswordInput )
        
    email = forms.EmailField(
        required = True,
        label = 'email address' )
    


で、views.py

# -*- encoding: utf-8 -*-
from django.conf import settings
from django import newforms as forms
from django.contrib.auth.models import User
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect

from forms import UserRegistrationForm


def regist_user( request ) :
    if request.user.is_authenticated():
        pass # TODO

    if request.POST :
        data = request.POST.copy()
        form = UserRegistrationForm( data )
        if form.is_valid() :
            username = data[ 'username' ]
            email = data[ 'email' ]
            password = data[ 'password' ]
            user = User.objects.create_user( username, email, password )
            user.save()
            return HttpResponseRedirect( '/admin' )
        else :
            return render_to_response( 'regist/register.html',
                                       { 'form': form } )
    else :
        # TODO
        form = UserRegistrationForm()
        return render_to_response( 'regist/register.html',
                                   { 'form': form } )
    


うーん、ダメダメです。
正常系は通りますが、
ユーザーネームがユニークかどうかのチェックをしていないので
user.save()でエラーが出ます。
formのチェック以外にもこっちもチェックしなくてはいけませんね……
あと、form_for_model() を使った方が良いかもしれません。

人生ってそういう物です。

と、ここで色々調べていたら
django-registration - Google Code
こんな物を発見しました!!
これを使うと良くある登録フォームのように
メールを送ってメールアドレスの確認後、登録できたり出来るみたいです。
というわけで、次回はdjango-registrationに翻弄されてみたいと思います。