"Модель 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})
Я ценю любую помощь, я учусь, и если вы также можете дать мне какое-то видео или несколько советов, я буду очень благодарен.