"Модель Patients в Django не распознает атрибут 'user' при регистрации нового пользователя".

Я практикую вход, регистрацию и выход из системы в Django. Я хочу создать пациента через регистрацию и сохранить информацию о регистрации в Patients, который находится в моем models.py. Когда я выполняю регистрацию, я получаю следующую ошибку в терминале:

raise self.RelatedObjectDoesNotExist( pacientes.models.Pacientes.user.RelatedObjectDoesNotExist: У Pacientes нет пользователя.

Вот код моего упражнения.

models.py

from django.db import models
from django.contrib.auth.models import User

class Pacientes(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
nombre = models.CharField(max_length=50)
apellido = models.CharField(max_length=50)
fecha_nacimiento = models.DateField()
genero = models.CharField(max_length=1)
address = models.CharField(max_length=50)
email = models.EmailField()
phone = models.CharField(max_length=50)
picture_profile = models.ImageField(upload_to='profile_images', blank=True)

def __str__(self):
    return self.user.username + ' ' + self.user.last_name

forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from .models import Pacientes

class PacientesForm(forms.ModelForm):
    password1 = forms.CharField(label='Contraseña', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirmar contraseña', widget=forms.PasswordInput)

    class Meta:
        model = Pacientes
        fields = ['nombre', 'apellido', 'fecha_nacimiento', 'genero', 'address', 'email', 'phone', 'picture_profile', 'password1', 'password2']

def clean_password2(self):
    password1 = self.cleaned_data.get("password1")
    password2 = self.cleaned_data.get("password2")
    if password1 and password2 and password1 != password2:
        raise forms.ValidationError("Las contraseñas no coinciden")
    return password2

def save(self, commit=True):
    paciente = super().save(commit=False)
    user = paciente.user
    user.set_password(self.cleaned_data["password1"])  # Guarda la contraseña en el objeto User
    if commit:
        user.save()
        paciente.save()
    return paciente

class EmailAuthenticationForm(AuthenticationForm):
    username = forms.EmailField(widget=forms.EmailInput(attrs={'autofocus': True}))

views.py

from django.shortcuts import render
from django.contrib.auth import login, authenticate
from .forms import PacientesForm, EmailAuthenticationForm
from django.contrib.auth.views import LoginView, LogoutView
from django.shortcuts import redirect
from pacientes.models import Pacientes
from django.contrib.auth.models import User
from django.db import IntegrityError
from django.http import HttpResponse
from django.urls import reverse

class PatientsLoginView(LoginView):
    template_name = 'pacientes/login.html'
    authentication_form = EmailAuthenticationForm
    redirect_authenticated_user = True

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['request'] = self.request
        return kwargs

    def get_success_url(self) -> str:
        return reverse('pacientes:index')

class PatientsLogoutView(LogoutView):
    next_page = 'core:index'

def index(request):
    return render(request, 'pacientes/index.html')

def register(request):
    if request.method == 'POST':
        form = PacientesForm(request.POST)
        if form.is_valid():
        try:
            # Crear un nuevo usuario
            user = User.objects.create_user(
                username=form.cleaned_data['email'],
                email=form.cleaned_data['email'],
                password=form.cleaned_data['password1'],
                first_name=form.cleaned_data['nombre'],
                last_name=form.cleaned_data['apellido']
            )

            # Crear un objeto Pacientes y asociarlo al usuario creado
            paciente = form.save(commit=False)
            paciente.user = user
            paciente.save()

            return redirect('pacientes:index')

        except IntegrityError:
            return HttpResponse("El correo electrónico ya está en uso.")
    else:
        form = PacientesForm()
    return render(request, 'pacientes/register.html', {'form': form})

Я ценю любую помощь, я учусь, и если вы также можете дать мне какое-то видео или несколько советов, я буду очень благодарен.

Вернуться на верх