Registro de usuarios
Django versión 1.0
SO Debian lenny
Necesito hacer un formulario de registro de usuario que contenga nombre de usuario correo electrónico y contraseña.
Si bien como dice el Django book en el capítulo 14 Django proporciona un formulario prefabricado que se puede usar con este fin con el modulo UserCreationForm como se describe en el ejemplo, este gestiona solo usuario y contraseña no posee campo de correo electrónico.
Por eso decidí crear un formulario que ingresara estos datos a bajo nivel como también se describe en ese capitulo del libro.
Para empezar agregue la siguiente entrada a urls.py
(r'^register/$', 'mysite.books.views.register'),
Luedo escribí la clase register_user formulario en forms.py
class register_user(forms.Form):
usuario = forms.CharField(max_length=30)
email = forms.EmailField()
password1 = forms.CharField(max_length=10, widget= forms.PasswordInput)
password2 = forms.CharField(max_length=10, widget= forms.PasswordInput)
Esta clase define los campos del formulario que son una entrada de usuario, e- mail, contraseña y repetir la contraseña.
En views.py primero importo desde forms.py register_user para usarlo en la función register.
from forms import register_user
Luego defino la función register de esta manera:
def register(request):
if request.method == 'POST':
form = register_user(request.POST)
if form.is_valid():
#cd = form.cleaned_data
name_user = form.cleaned_data['usuario']
email_user = form.cleaned_data['email']
pass_user = form.cleaned_data['password1']
create_user = User.objects.create_user(username= name_user, email= email_user,
password=pass_user)
create_user.is_staff = True
create_user.save()
return HttpResponseRedirect('/specials_books/')
else:
form = register_user()
return render_to_response('registration/register.html', {'form': form})
Si hay un envío del formulario por medio del método POST accedo a los datos y los guardo en form, se validan y volvemos a acceder por medio de cleaned_data
name_user = form.cleaned_data['usuario']
email_user = form.cleaned_data['email']
pass_user = form.cleaned_data['password1']
Luego creamos un usuario con estos datos
create_user = User.objects.create_user(username= name_user, email= email_user,
password=pass_user)
Y luego los guardamos.
create_user.is_staff = True
create_user.save()
Esta vista asume que existe la carpeta registration y dentro el archivo register.html que sería algo así
<div class="form_subtitle">crear un nuevo usuario</div>
<form name="." method="post">
<div class="form_row">
<div class="contact_input" />{{ form.usuario.errors }}</div>
<label class="contact"><strong>usuario:</strong></label>
<div class="contact_input" />{{ form.usuario }}</div>
</div>
<div class="form_row">
<div class="contact_input" />{{ form.email.errors }}</div>
<label class="contact"><strong>Email:</strong></label>
<div class="contact_input" />{{ form.email }}</div>
</div>
<div class="form_row">
<div class="contact_input" />{{ form.password1.errors }}</div>
<label class="contact"><strong>contraseña:</strong></label>
<div class="contact_input" />{{ form.password1 }}</div>
</div>
<div class="form_row">
<div class="contact_input" />{{ form.password2.errors }}</div>
<label class="contact"><strong>de vuelta:</strong></label>
<div class="contact_input" />{{ form.password2 }}</div>
</div>
<div class="form_row">
<input type="submit" class="register" value="registrar" />
</div>
</form>
</div>
Agregando más validación
Además del sistema de validación que proporciona el objeto form, decidí agregar dos mas, que la cantidad de dígitos de la contraseña no sea menor que cuatro y que sea necesario escribirla de vuelta.
Para ello se agrego dentro la clase register_user en el archivo forms.py las funciones
clean_password1 y clean_password2 quedando el código completo así.
class register_user(forms.Form):
usuario = forms.CharField(max_length=30)
email = forms.EmailField()
password1 = forms.CharField(max_length=10, widget= forms.PasswordInput)
password2 = forms.CharField(max_length=10, widget= forms.PasswordInput)
#Validar de la cantidad de letras del password
def clean_password1(self):
password1 = self.cleaned_data.get('password1', '')
num_words = len(password1)
if num_words < 4:
raise forms.ValidationError('Ingrese mas de cuatro palabras')
return password1
#Comparar las dos contraseñas
def clean_password2(self):
password1 = self.cleaned_data.get('password1', '')
password2 = self.cleaned_data.get('password2', '')
if password1 != password2:
raise forms.ValidationError('Repita la contraseña correctamente')
return password2
Todo esto puede verse funcionando en el proyecto webookstore donde fue usado.
Aún no hay trackbacks