Skip to content

App Users

Angel riera edited this page Apr 1, 2022 · 3 revisions

Registro de usuarios personalizado

creamos los modelos

models.py

from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils.translation import gettext_lazy as _


# administra al customuser
class CustomUserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""

    def _create_user(self, email, password=None, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError("The given email must be set")
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", False)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password=None, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")
        return self._create_user(email, password, **extra_fields)


# user general que se autenticará con email
class CustomUser(AbstractUser):
    username = None
    email = models.EmailField(_("email address"), unique=True)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    # necesita de un manager que lo administre para crearlo con ciertos campos
    objects = CustomUserManager()

creamos los formularios de usuario

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm

from .models import CustomUser, Seller


class UserForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ("first_name", "last_name", "email", "password1", "password2")


class UserEditForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = ("first_name", "last_name", "email")

Decorador para no autentificado

decorators.py

from django.shortcuts import redirect


def unauthenticated_user(view_func):
    def wrapper_func(request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect("ecommerce:home")
        else:
            return view_func(request, *args, **kwargs)

    return wrapper_func

Creamos la veiw de registro, login, logut, y modificar usuario

# Todas las importaciones
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, render

from ecommerce.decorators import unauthenticated_user
from ecommerce.models import Product
from users.models import Seller

from .forms import SellerForm, UserEditForm, UserForm

registro de usuario

@unauthenticated_user
def register_view(request):
    form = UserForm
    if request.method == "POST":
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            useremail = form.cleaned_data.get("email")
            messages.success(request, f"{useremail} was succesfully created")
            return redirect("users:login")

    return render(request, "users/register.html", {"user_registration": form})

login de usuario

@unauthenticated_user
def login_view(request):
    if request.method == "POST":
        email = request.POST.get("email")
        password = request.POST.get("password")

        user = authenticate(request, email=email, password=password)
        if user is not None:
            login(request, user)
            return redirect("ecommerce:home")
        else:
            messages.info(request, "Email or password is incorrect.")

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

logut

def logout_view(request): logout(request) return redirect("users:login")

Registro de vendedores

siderbar

Clone this wiki locally