A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Signup

22/37
Recursos

Crearemos el Registro de usuario a partir de la clase perfil, por lo que usaremos un formulario personalizado. Definiremos un nuevo Template para el formulario. Dejaremos que el browser se encargue de las validaciones generales. S贸lo validaremos en python la coincidencia entre password y confirmaci贸n del password. Incluiremos una validaci贸n con try/catch para evitar que se dupliquen usuarios con mismo nombre.

Aportes 38

Preguntas 16

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Por si a alguno le pas贸 que le dio un Multikey value error, les dejo la soluci贸n en Django 3.0 para los m茅todos de post:

username = request.POST['username']
        password = request.POST.get('passwd', True)
        passwordConfirmation = request.POST.get('passwd_confirmation', True)

Le agregue validacion de email para que no se registren emails ya usados.

def signup_view(request):
    '''Signup view'''

    if request.method == 'POST':
        email = request.POST['email']
        username = request.POST['username']
        password = request.POST['password']
        password_confirm = request.POST['password_confirm']

        # PASSWORD VALIDATION
        if password != password_confirm:
            error = 'The passwords do not match.'
            return render(request, 'users/signup.html', {'error': error})
        
        # EMAIL VALIDATION
        u = User.objects.filter(email=email)
        if u:
            error = f'There is another account using {email}'
            return render(request, 'users/signup.html', {'error': error})
        
        # USERNAME VALIDATION 
        try:
            user = User.objects.create_user(username=username, password=password)
            user.email = email
            user.save()

            profile = Profile(user=user)
            profile.save()

            login(request, user)
            return redirect('profile') # CAMBIAR >> Redireccionar a completar perfil
        except IntegrityError as ie:
            error = f'There is another account using {usermame}'
            return render(request, 'users/signup.html', {'error': error})

    return render(request, 'users/signup.html')

Al final del registro estar铆a mejor hacer login y redireccionar al feed, en lugar de hacer registro y despu茅s login:

def signup_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        password_confirmation = request.POST['password_confirmation']

        if password != password_confirmation:
            return render(request, 'users/signup.html', {'error': 'Password confirmation does not match'})

        try:
            user = User.objects.create_user(username=username, password=password)
        except IntegrityError as ie:
            return render(request, 'users/signup.html', {'error': 'Username is already in use'})

        user.first_name = request.POST['firstname']
        user.last_name = request.POST['lastname']
        user.email = request.POST['email']
        user.save()

        profile = Profile(user=user)
        profile.save()

        login(request, user)
        return redirect('feed')

    return render(request, 'users/signup.html')

codigo del signup

{% extends "users/base.html" %}

{% block head_content %}
<title>Platzigram sign up</title>
{% endblock %}

{% block container %}

    {% if error %}
        <p class="alert alert-danger">{{ error }}</p>
    {% endif %}

    <form action="{% url 'signup' %}" method="POST">
        {% csrf_token %}

        <div class="form-group">
            <input class="form-control" type="text" placeholder="Username" name="username" required="true" />
        </div>

        <div class="form-group">
            <input class="form-control" type="password" placeholder="Password" name="password" required="true" />
        </div>

        <div class="form-group">
            <input class="form-control" type="password" placeholder="Password confirmation" name="password_confirmation" required="true" />
        </div>

        <div class="form-group">
            <input class="form-control" type="text" placeholder="Firs namet" name="first_name" required="true" />
        </div>

        <div class="form-group">
            <input class="form-control" type="text" placeholder="Last name" name="last_name" required="true" />
        </div>

        <div class="form-group">
            <input class="form-control" type="email" placeholder="eMail address" name="email" required="true" />
        </div>

        <button class="btn btn-primary btn-block mt-5" type="submit">Register!</button>

    </form>
{% endblock %}
Hay alguna forma que yo como administrador acepte al nuevo user que se cre贸? Ejemplo: una persona X crea una nueva cuenta, pero no puede usarla hasta que yo la habilite

https://chrome.google.com/webstore/detail/fake-filler/bnjjngeaknajbdcgpfkgnonkmififhfo/related?hl=es

Para que llenen los formularios con datos de prueba a un click, desde el navegador

Modifiqu茅 algo en el sign up para que en vez de hacerle redirecci贸n a que inicie sesi贸n, de una vez entra al feed de posts

def signup(request):
    """Sign up view."""
    if request.method == 'POST':
        username = request.POST['username']
        passwd = request.POST['passwd']
        passwd_confirmation = request.POST['passwd_confirmation']
        
        if passwd != passwd_confirmation:
            return render(
                request,
                'users/signup.html',
                {'error': 'Password confirmation does not match'}
            )
        
        try:
            user = User.objects.create_user(
                username=username,
                password=passwd,
            )
        except IntegrityError:
            return render(
                request,
                'users/signup.html',
                {'error': 'Username is already in use'}
            )
            
        user.first_name = request.POST['first_name']
        user.last_name = request.POST['last_name']
        user.email = request.POST['email']
        user.save()
        
        profile = Profile(user=user)
        profile.save()
        
        # return redirect('login')
        login(request, user)
        return redirect('feed')
    return render(request, 'users/signup.html')

hice el signup un tanto diferente, con verificador de username y email.

def signup_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        password_confirmation = request.POST['password_confirmation']
        email = request.POST['email']

        if password != password_confirmation:
            return render(request, 'users/signup.html', {'error': "Passwords does'nt match"})
        
        if User.objects.filter(username=username).exists():
            return render(request, 'users/signup.html', {'error': "Username is already exists."})

        if User.objects.filter(email=email).exists():
            return render(request, 'users/signup.html', {'error': "Email is already registered."})

        user = User.objects.create_user(username=username, password=password, email=email)

        user.first_name = request.POST['first_name'] 
        user.last_name = request.POST['last_name'] 
        user.save()

        profile = Profile(user=user)
        profile.save()

        login(request, user)
        return redirect('feed')

    return render(request, 'users/signup.html')

Siguiendo los comentarios y sugerencias de varios agregue al modelo de User el campo unique para email, para que no puedan haber emails repetidos:

User._meta.get_field('email')._unique = True

Luego agregue el email en create_user para que valide el email unico al crearse el usuario antes de registrarlo en la BD e hice un if en el try para validar si el IntegrityError fuera generado por el username o por el email y devolver el correspondiente error:

def signup_view(request):
    if request.method == "POST":
        password = request.POST["password"]
        password_confirmation = request.POST["password_confirmation"]
        if password != password_confirmation:
            return render(request, 'users/signup.html', { "error": "Password confirmation does not match "})
        
        username = request.POST["username"]
        email = request.POST["email"]

        try:
            user = User.objects.create_user(username=username, password=password, email=email)
        except IntegrityError as e:
            if e.args[0] == 'UNIQUE constraint failed: auth_user.email':
                return render(request, 'users/signup.html', { "error": "Email is already in use"})
            else:
                return render(request, 'users/signup.html', { "error": "Username is already in use"})

        user.first_name = request.POST["first_name"]
        user.last_name = request.POST["last_name"]
        user.save()

        profile = Profile(user=user)
        profile.save()

Por ultimo no use redirect(鈥渓ogin鈥), sino que renderice el template de login pasandole como contexto mensaje de success si el usuario fue creado con exito para que lo muestre en el html:

return render(request, 'users/login.html', { "success": "User created successfully"})

codigo del view

"""Users views."""
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect

# Exceptions
from django.db.utils import IntegrityError

# Models
from django.contrib.auth.models import User
from users.models import Profile

# Create your views here.

def login_view(request):
    """Login view."""
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            return redirect('feed')
        else:
            return render(request, 'users/login.html', {'error': 'Ivanlid username and password'})
    return render(request, 'users/login.html')


def signup(request):
    """Sign up view."""
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        password_confirmation = request.POST['password_confirmation']

        if password != password_confirmation:
            return render(request, 'users/signup.html', {'error': 'Password confirmation does not match'})

        try:
            user = User.objects.create_user(username=username, password=password)
        except IntegrityError:
            return render(request, 'users/signup.html', {'error': 'Username is already in use'})

        user.first_name = request.POST['first_name']
        user.last_name = request.POST['last_name']
        user.email = request.POST['email']
        user.save()

        profile = Profile(user=user)
        profile.save()

        return render(request, 'users/login.html')

    return render(request, 'users/signup.html')

@login_required
def logout_view(request):
    """Logout view."""
    logout(request)
    return redirect('login')

Para : Platzi Team

El d铆a de ayer env铆e un a pregunta en cuanto a que no me sale correctamente la pantalla centrada el username, password y Sign In , tambi茅n no se despliega el icono de instagram.

El anterior problema lo tengo desde el video 19 de 鈥淭emplates y archivos est谩ticos鈥.

Por lo cual pido apoyo al equipo Platzi Team, ya que no he obtenido respuesta para solucionar lo anterior, siendo importante ya que estoy por iniciar el video 22 "Signup"
no quiero completar el curso con estos detalles importantes sin solucionar !!!

Atte.

Anibal

Para los que les sale multiples errores, yo tuve que mezclar mucho de muchos comentarios. Principalmente gracias a Diego Casillas Duarte y franciscoyorlano.
Mi codigo es este, espero a alguien lo salve

En users/views.py

from django.contrib.auth.models import User
from users.models import Profile
from django.db import IntegrityError


def signup_view(request):
    '''Signup view'''

    if request.method == 'POST':
        email = request.POST['email']
        username = request.POST['username']
        password = request.POST.get('passwd', True)
        password_confirm = request.POST.get('passwd_confirmation', True)

        # PASSWORD VALIDATION
        if password != password_confirm:
            error = 'The passwords do not match.'
            return render(request, 'users/signup.html', {'error': error})
        
        # EMAIL VALIDATION
        u = User.objects.filter(email=email)
        if u:
            error = f'There is another account using {email}'
            return render(request, 'users/signup.html', {'error': error})
        
        # USERNAME VALIDATION 
        try:
            user = User.objects.create_user(username=username, password=password)
            user.email = email
            user.save()

            profile = Profile(user=user)
            profile.save()

            login(request, user)
            return redirect('profile') # CAMBIAR >> Redireccionar a completar perfil
        except IntegrityError as ie:
            error = f'There is another account using {username}'
            return render(request, 'users/signup.html', {'error': error})

    return render(request, 'users/signup.html')


@login_required
def logout_view(request):
    """Logout a user"""

    logout(request)
    return redirect('login')

En platzigram/urls.py

urlpatterns = [
    path('users/signup', users_views.signup_view, name='signup'),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

Y luego en el template es id茅ntico al del profe. Mucha suerte!

Buenas d铆a, tengo un detalle鈥l usar los mismos c贸digos presentados en la clase me surge error UNIQUE constraint failed: auth_user.username鈥or lo que me marcar integrity error a pesar de que el usuario se acaba de crear y teniendo la excepci贸n integrity error programada. Versi贸n de django == 3.1, python == 3.8, OS == windows 10
![](url C:\Users\Lenovo\Desktop\EliasCAmovil\EliasCA\BROXIA Intelligence\integrity error.png)
![](url C:\Users\Lenovo\Desktop\signup.png)

Una vez el usuario se registro, pueden hacerle login asi:

...
login(request,user)
return redirect('feed')

De esta manera no tiene que llenar todos sus datos de nuevo en login ya que es tedioso

Pienso que en una futura actualizaci贸n de este curso y en muchos otros que sean de introducci贸n ser铆a bueno que mantuvieran este enfoque de ir de la mano con la documentaci贸n, es lo m谩s valioso que tiene este curso a nivel pedag贸gico.

Si se modifica un registro de la base de datos, a trav茅s de un objeto, recuerda utilizar save()

Como es de esperarse, es dentro de nuestra vista, que hacemos todas las validaciones, para ingresar los datos de un usuario.

Nota: Jam谩s confiar en las validaciones que hace el frontend.

Dentro de nuestro input, es mejor poner un requiered="True", adem谩s de ser consistentes con nuestros nombres.

Cada vez que se cree un usuario, se crea un perfil, debio al modelo Proxy que pusimos en la clase Profile.

I did my signup view this way, to prevent repeat code unnecessarily

def signup(request):
    if request.method == 'POST':
        fields = (
            'username',
            'passwd',
            'passwd_confirmation',
            'first_name',
            'last_name',
            'email',
        )
        error = {}
        user_data = dict((key, request.POST[key]) for key in fields)
        if user_data['passwd'] != user_data['passwd_confirmation']:
            error = {'error': 'Password confirmation doesn\'t match'}
        else:
            try:
                user = User.objects.create_user(username=user_data['username'], password=user_data['passwd'])
                user.first_name = user_data['first_name']
                user.last_name = user_data['last_name']
                user.email = user_data['email']

                user_profile = Profile(user=user)
                user_profile.save()
                return redirect('login')
            except IntegrityError as ex:
                error = {'error': "Username already taken!"}


    return render(request, 'users/signup.html', error)

Hola, soy de los tantos que no entienden nada de lo que esta haciendo en los archivos html, mas que nada cuando usa bootstrap.
Es para preocuparme? Un puesto de trabajo en el que pidan django tambien requiere saber el nivel del profesor en frontend? O de eso se encargaria un frontend y yo solamente debo saber integrarlo mediante vistas y logica?

perfecto muchas gracias pablo

Asi deje mi metodo porque puede ser un poco como primero creo usuarios y contrase帽a y luego instancio los otros campos.

def signup(request):
""鈥淪ign up view.鈥""
if request.method == 鈥楶OST鈥:
username = request.POST[鈥榰sername鈥橾
passwd = request.POST[鈥榩asswd鈥橾
passwd_confirmation = request.POST[鈥榩asswd_confirmation鈥橾

    if passwd != passwd_confirmation:
        return render(request, 'users/signup.html', {'error': 'Password confirmation does not match'})
    first_name = request.POST['first_name']
    last_name = request.POST['last_name']
    email = request.POST['email']
    try:
        user = User.objects.create_user(username=username, password=passwd,first_name=first_name,last_name=last_name,email=email)
    except IntegrityError:
        return render(request, 'users/signup.html', {'error': 'Username is already in user'})


    profile = Profile(user=user)
    profile.save()

    return redirect('login')

return render(request, 'users/signup.html')

View para signup

Haciendo las pruebas me sale este error cuando intento guardar a un usuario con el mismo username

En lugar del IntegrityError鈥 驴Por qu茅 ser谩?. Cuando coloco todos los datos correctos no me da ning煤n problema.

Este es mi m茅todo signup

C贸mo se debe hacer un request desde una aplicacion en React con el token de login? es decir , como desde una aplicaci贸n en React ouede decire al servidor de Django que ya hice login y tengo cierto scope?

def create_account(request):
    """Create account user"""
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        password_confirmation = request.POST['password_confirmation']
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        email = request.POST['email']

        if password != password_confirmation:
            return render(request, 'users/create_account.html', {'error': 'Password confirmation does not match'})

        try:
            user = User.objects.create_user(
                username=username, password=password, first_name=first_name, last_name=last_name, email=email)
        except IntegrityError:
            return render(request, 'users/create_account.html', {'error': 'Username ir already in user'})

        website = request.POST['website']
        phone_number = request.POST['phone_number']
        biography = request.POST['biography']

        profile = Profiles.objects.create(
            user=user, website=website, phone_number=phone_number, biography=biography)

        return redirect('login')

    return render(request, 'users/create_account.html')```

驴Alguien sabe c贸mo puedo hacer para guardar en MAY脷SUCLAS los datos recibidos de un form?

Intent茅 modificando el estilo en html pero, no funcion贸 XD, alguien sabe algo?

驴Porqu茅 se empecinan en mostrar herramientas de backend implementadas en frontend???
el curso que stoy tomando dice 鈥渂ackend con django鈥 y ya hasta aprend铆 html y css. No se pasen. Si dice backend. hagan backend鈥

Uno de los mejores profesores y cursos que hay鈥

Excelente clase les comparto este tutorial acerca de autentificacion de usuarios esta perfecto para complementar con esta clase:

formulario del signup.html

{% extends 'users/base.html' %}
{% block head_content %}
    <title>PlatziGram sign in</title>
{% endblock %}
{% block container %}
    <form action="{% url "signup" %}" method="POST">
        {% csrf_token %}
        <div class="form-group">
            <input class="form-control" type="text" placeholder="Username" name="name" required="true">
        </div>
        <div class="form-group">
            <input class="form-control" type="password" placeholder="Password" name="password" required="true">
        </div>
        <div class="form-group">
            <input class="form-control" type="password" placeholder="Password confirmation" name="password_confirmation" required="true">
        </div>
        <div class="form-group">
            <input class="form-control" type="text" placeholder="First name" name="first_name" required="true">
        </div>
        <div class="form-group">
            <input class="form-control" type="text" placeholder="Last name" name="last_name" required="true">
        </div>
        <div class="form-group">
            <input class="form-control" type="email" placeholder="Email" name="email" required="true">
        </div>
        <button class="btn btn-primary btn-block mt-5" type="submit"> Sign in!</button>
    </form>
{% endblock

Crearemos el Registro de usuario a partir de la clase perfil, por lo que usaremos un formulario personalizado. Definiremos un nuevo Template para el formulario. Dejaremos que el browser se encargue de las validaciones generales. S贸lo validaremos en python la coincidencia entre password y confirmaci贸n del password. Incluiremos una validaci贸n con try/catch para evitar que se dupliquen usuarios con mismo nombre.

Muy buen ejercicio

Para poder agregar un bot贸n al Login para acceder al SignUp pueden agregar esto en el archivo: [users/login.html]
(afuera del <form>)

<button class="btn btn-primary btn-block mt-5" onclick="location.href = '{% url "signup" %}'">Sign Up!</button>
```html

jejeje, funciona!