Невозможно связать модель Объект с другой моделью, которая принимает значение 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). Буду признателен за любую помощь