jstoledano / cerebro

El cuadro de mando, simple pero efectivo.
MIT License
0 stars 0 forks source link

Registration Form #78

Closed jstoledano closed 1 month ago

jstoledano commented 1 month ago

Esta es la respuesta de ChatGPT:

Para que tu formulario de registro registration_form.html también permita la creación del modelo Profile, necesitas hacer algunas modificaciones tanto en el formulario como en la vista que maneja el registro del usuario. Aquí te explico cómo hacerlo:

1. Crear un Formulario Personalizado

Debes crear un formulario que combine los campos del modelo User y Profile. Esto se hace extendiendo UserCreationForm y añadiendo los campos del modelo Profile.

Formulario personalizado en forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from .models import Profile

class CustomUserCreationForm(UserCreationForm):
    state = forms.ChoiceField(choices=ENTIDADES, required=True)
    site = forms.ChoiceField(choices=SITIO, required=True)
    position = forms.ChoiceField(choices=PUESTOS, required=True)
    order = forms.IntegerField(required=False, initial=99)

    class Meta:
        model = User
        fields = ('username', 'password1', 'password2', 'state', 'site', 'position', 'order')

    def save(self, commit=True):
        user = super().save(commit=False)
        if commit:
            user.save()
            Profile.objects.create(
                user=user,
                state=self.cleaned_data['state'],
                site=self.cleaned_data['site'],
                position=self.cleaned_data['position'],
                order=self.cleaned_data.get('order', 99)
            )
        return user

2. Modificar la Vista de Registro

Ahora necesitas modificar la vista que maneja el registro del usuario para que utilice este formulario personalizado.

Vista personalizada en views.py

from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from .forms import CustomUserCreationForm

def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=password)
            login(request, user)
            return redirect('index')  # Redirige al inicio u otra página después del registro
    else:
        form = CustomUserCreationForm()
    return render(request, 'registration/registration_form.html', {'form': form})

3. Actualizar el Template registration_form.html

Tu template ya está preparado para manejar el formulario personalizado, así que no es necesario hacer muchas modificaciones. Solo asegúrate de que el formulario personalizado sea pasado correctamente al contexto en la vista.

Template registration_form.html

{% extends "base.html" %}
{% load static %}
{% load i18n %}
{% load crispy_forms_tags %}

{% block content %}
<form method="post" action=".">
  {% csrf_token %}
  {{ form | crispy }}

  <input type="submit" value="{% trans 'Submit' %}" />
</form>
{% endblock %}

Resumen

  1. Formulario Personalizado: Creamos un formulario (CustomUserCreationForm) que combina los campos de User y Profile.
  2. Vista Personalizada: La vista de registro utiliza este formulario personalizado para crear tanto el usuario como su perfil.
  3. Template: El template ya está configurado para manejar el formulario personalizado sin necesidad de cambios adicionales.

Ahora, cuando un usuario se registre usando este formulario, se creará tanto el User como su correspondiente Profile con los datos proporcionados.