Reaproveitando UserCreationForm

No início do trabalho criei um formulário de registro próprio, mas depois que tudo estava funcionando, lembrei que o Django tem o UserCreationForm em django.contrib.auth.forms. O código em forms.py estava assim:




class FormularioRegistro(forms.Form):


usuario = forms.RegexField(label = u'Usuário', regex = USUARIO_REGEX, min_length = USER_MIN, max_length = USER_MAX, required = True, widget = forms.TextInput(), help_text = u'Digite apenas letras,números e sublinhado (_)')
senha = forms.CharField(label = u'Senha', required = True, widget = forms.PasswordInput(), min_length = SENHA_MIN, max_length = SENHA_MAX, help_text = u'Digite no mínimo,' + repr(SENHA_MIN) + u' caracteres e no máximo, ' + repr(SENHA_MAX) + '.')

email = forms.EmailField(label = u'E-mail', required = True, widget = forms.TextInput(), help_text = u'Este e-mail será usado para recuperar sua senha caso você a esqueça.')





E como existe a possibilidade de alguém escolher um nome de usuário repetido, a verificação em views.py estava dessa forma:



def valida_registro(request):
'''
Valida os dados do registro, retornando a página de registro com o status.
'''

formulario = FormularioRegistro(request.POST.copy())


if formulario.is_valid():

try:
User.objects.create_user(username = request.POST['username'], email = request.POST['email'] , password = request.POST['password2'])

except dbmodule.IntegrityError:

formulario.data['senha'] = ''

resposta = HttpResponse()
template = Template(get_arquivo('registro'))
contexto = Context({'formulario': formulario})
resposta.content = template.render(contexto)

return resposta

else:
return HttpResponse(200)


formulario.data['senha'] = ''
resposta = HttpResponse()
template = Template(get_arquivo('registro'))
contexto = Context({'formulario': formulario})
resposta.content = template.render(contexto)

return resposta




Note que não havia confirmação de senha, e se eu colocasse um segundo campo para isso, deveria escrever o método clean correspondente, gerando uma exceção se os dois campos não fossem iguais. Substituindo o formulário pelo UserCreationForm, não tenho o campo de e-mail, necessário para recuperar a senha. Mas reescrevendo o método __init__ do seguinte modo, não perco a validação por expressões regulares e incluo um campo de e-mail, ganhando a verificação da confirmação de senha de graça:



class FormularioRegistro(UserCreationForm):

email = forms.EmailField(label = u'E-mail', required = True, widget = forms.TextInput(), help_text = u'Este e-mail será usado para recuperar sua senha caso você a esqueça.')

def __init__(self, *args, **kwargs):
super(FormularioRegistro, self).__init__(*args, **kwargs)


self.fields['username'] = forms.RegexField(label = u'Usuário', regex = USUARIO_REGEX, min_length = USER_MIN, max_length = USER_MAX, required = True, widget = forms.TextInput(), help_text = u'Digite apenas letras,números e sublinhado (_)')

self.fields['password1'].min_length = SENHA_MIN
self.fields['password1'].max_length = SENHA_MAX
self.fields['password2'].min_length = SENHA_MIN
self.fields['password2'].max_length = SENHA_MAX





def valida_registro(request):
'''
Valida os dados do registro, retornando a página de registro com o status.
'''

formulario = FormularioRegistro(request.POST.copy())


if formulario.is_valid():
User.objects.create_user(username = request.POST['username'], email = request.POST['email'] , password = request.POST['password2'])
return HttpResponse(200)


formulario.data['senha'] = ''
resposta = HttpResponse()
template = Template(get_arquivo('registro'))
contexto = Context({'formulario': formulario})
resposta.content = template.render(contexto)

return resposta

Novos Trabalhos

Enquanto mudo a cara do blog e me descabelo com os trabalhos de Java, crio meu trabalho final p/ pós. Pouco me importa se deveria ser uma aplicação mobile que descasca abacaxis ou um viewer web do telescópio Hubble.

Free Image Hosting at www.ImageShack.us

Mesmo sendo um projeto de 1 pessoa só, estou usando o Redmine (Ruby on Rails) p/ manter as coisas sob controle. É melhor que sair anotando as coisas em pedaços de papel. A única coisa que não consegui configurar nele foi o módulo de repositório para o Git, mas nem existe tanta necessidade assim (o git citool já serve).