Невозможно связать модель Объект с другой моделью, которая принимает значение OnetoOnefiled

Итак, у меня есть страница входа в систему, на которой также есть возможность зарегистрироваться, если вы новый пользователь. Фаза регистрации состоит из двух страниц: одна, где пользователь вводит свои личные данные, и вторая, где пользователь задает имя пользователя и пароль. Сейчас я храню их в виде строк, просто чтобы запустить свой сайт. Мне удалось создать объект модели для личной информации, а также связать этот объект с недавно созданным объектом данных для входа. Я пытаюсь сравнить введенные пользователем значения на странице входа в систему с объектами, хранящимися в базе данных, и, как только они совпадут, я хочу иметь возможность получить роль пользователя, которая является частью объекта UserData, и перейти к соответствующей панели. Я не могу заставить это работать

Registration.js

import React, { useState, useEffect } from 'react';
import axios from 'axios';
import { useNavigate } from 'react-router-dom';

const RegistrationPage = () => {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');
  const navigate = useNavigate();

  const [latestUserData, setUserData] = useState(null);

  useEffect(() => {
    const fetchLatestObject = async () => {
      try {
        const response = await axios.get('http://127.0.0.1:8000/latest-object/');
        console.log(response)
        setUserData(response.data.user_data);
        console.log(response.data.user_data)
      } catch (error) {
        console.error('Error fetching latest object:', error);
      }
    };

    fetchLatestObject();
  }, []);

  
  const handleRegister = () => {
    console.log(username, password)
    axios.post('http://127.0.0.1:8000/api/register/', {
      'username': username,
      'password': password,
      'user_data': latestUserData
      })
      .then(response => console.log(response.data))
      .catch(error => console.error(error));
    navigate('/');
  };

  return (
    <div>
      <h2>Registration</h2>
      <input type="text" placeholder="Username" onChange={e => setUsername(e.target.value)} />
      <input type="password" placeholder="Password" onChange={e => setPassword(e.target.value)} />
      <button onClick={handleRegister}>Register</button>
    </div>
  );
};

export default RegistrationPage;

Models.py

class UserData(models.Model):
ROLE_CHOICES = (
    ('Recruiter', 'Recruiter'),
    ('Manager', 'Manager'),
    ('Business Development Partner', 'Business Development Partner'),
    ('Business Development Partner Manager', 'Business Development Partner Manager'),
    ('Account Manager', 'Account Manager'),
)

fullName = models.CharField(max_length=255, blank=True, null=True)
gender = models.CharField(max_length=10, blank=True, null=True)
aadhaarNumber = models.CharField(max_length=12, blank=True, null=True)
dateOfBirth = models.DateField(null=True, blank=True)
maritalStatus = models.CharField(max_length=20, blank=True, null=True)
emergencyContact = models.CharField(max_length=255, blank=True, null=True)
address = models.TextField(blank=True, null=True)
phoneNumber = models.IntegerField(validators=[MinValueValidator(0000000000), MaxValueValidator(9999999999)], blank=True, null=True)
emailID = models.EmailField(validators=[EmailValidator()], blank=True, null=True)
emergencyContactNumber = models.IntegerField(validators=[MinValueValidator(0000000000), MaxValueValidator(9999999999)], blank=True, null=True)
jobTitle = models.CharField(max_length=100, blank=True, null=True)
departmentName = models.CharField(max_length=100, blank=True, null=True)
joiningDate = models.DateField(blank=True, null=True)
employmentType = models.CharField(max_length=100, blank=True, null=True)
prevCompany = models.CharField(max_length=255, blank=True, null=True)
prevDesignation = models.CharField(max_length=100, blank=True, null=True)
relevantSkills = models.TextField(blank=True, null=True)
documentAcknowledged = models.BooleanField(default=False, null=True)
pfUAN = models.CharField(max_length=100, blank=True, null=True)
esiNO = models.CharField(max_length=100, blank=True, null=True)
role = models.CharField(max_length=50, choices=ROLE_CHOICES, null=True)

def __str__(self):
    return self.fullName if self.fullName else "Unnamed User"

class LoginDetails(models.Model):
    user_data = models.OneToOneField(UserData, on_delete=models.CASCADE, null = True)
    username = models.CharField(max_length=255, unique=True, null=True)
    password = models.CharField(max_length=255, null=True)  # Note: It's recommended to use hashed passwords in production
    def __str__(self):
        return self.username

Views.py

def get_latest_user(request):
if request.method == 'GET':
    latest_object_id = UserData.objects.latest('id').id
    user_data = UserData.objects.get(id=latest_object_id)
    serialized_user_data = serialize("json", user_data)
    return JsonResponse({'user_data': serialized_user_data})
else:
    return JsonResponse({'error': 'Method not allowed'}, status=405)

@csrf_exempt
def verify_login(request):
    if request.method == 'POST':
        data = request.POST
    # Retrieve stored login details
    stored_login = LoginDetails.objects.filter(username=data.get('username')).first()
    print(stored_login.username)

    if stored_login:
        # Compare the passwords directly
        if data.get('password') == stored_login.password:
            # Authentication successful
            user_role = stored_login.user_data.role if stored_login.user_data and stored_login.user_data.role else None
            print(user_role)
            return JsonResponse({'message': 'Login successful', 'role': user_role})
        else:
            # Password does not match
            return JsonResponse({'error': 'Invalid password'}, status=401)
    else:
        # Username not found
        return JsonResponse({'error': 'Invalid username'}, status=401)

return JsonResponse({'error': 'Invalid request method'}, status=405)

Urls.py

path('api/register/', LoginDetailsViewSet.as_view({'post': 'create'}), name='register'),
    path('api/login/', verify_login, name='user-login'),
    path('latest-object/', get_latest_user, name='latest_object_detail'),

Employeregistration.py (публикуется только часть, связанная с вызовом api)

 const handleSubmit = (event) => {
event.preventDefault();

// Make an HTTP POST request using Axios
axios.post('http://127.0.0.1:8000/submit_user_data/', userData)
  .then(response => {
    console.log('Data sent successfully:', response.data);
    // Reset the form after successful submission
    setUserData({ ...userData});
    navigate('/usernameregistration');
  })
  .catch(error => {
    console.error('Error sending data:', error);
  });

};

Прямо сейчас я получаю сообщение UserData is not iterable. Но я также пытался отправить идентификатор объекта userdata вместо всего объекта, но это тоже не сработало (Failed to retrieve the role). Буду признателен за любую помощь

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