React и Django простая ошибка jwt profile update not null
моя проблема Я создал модель профиля пользователя, которая является отношением один к одному с пользовательской моделью пользователя django для обновления профиля из react. когда я нажимаю кнопку обновления в моем ui, он говорит update user profile failed. Я пробовал изменить модель на null=True и я делаю makemigrations и migrate много раз, но это не работает. Заранее благодарю за ответ! Моя ошибка
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: profiles_userprofile.user_id
[09/Dec/2021 16:00:49] "PUT /profile-api/update-profile/ HTTP/1.1" 500 198827
Модель профиля пользователя
from django.db import models
from django.conf import settings
class UserProfile(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
phone = models.CharField(max_length=30, default='')
address = models.CharField(max_length=300, default='')
profile_image = models.ImageField(upload_to="profile_images", default='')
Сериализатор профиля пользователя
from rest_framework import serializers
from .models import UserProfile
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ('phone', 'contact', 'profile_image',)
Просмотр профиля пользователя
class UserProfileView(APIView):
parser_classes = (MultiPartParser, FormParser)
permission_classes = (permissions.IsAuthenticated,)
def put(self, request, format=None):
user = self.request.user
email = user.email
data = self.request.data
phone = data['phone']
address = data['address']
profile_image = data['profile_image']
UserProfile.objects.filter(user=user).update_or_create(
phone=phone, address=address, profile_image=profile_image)
user_profile = UserProfile.objects.get(user=user)
user_profile = UserProfileSerializer(user_profile)
return Response({'profile': user_profile.data, "email": str(email)},
status=status.HTTP_200_OK)
Обновить профиль реагировать действия
export const update_profile =
(phone, address, profile_image) => async (dispatch) => {
const config = {
headers: {
"Content-Type": "multipart/form-data",
Authorization: `JWT ${localStorage.getItem("access")}`,
},
};
let form_data = new FormData();
form_data.append("phone", phone);
form_data.append("address", address);
form_data.append("profile_image", profile_image, profile_image.name);
try {
const res = await axios.put(
`${process.env.REACT_APP_API_URL}/profile-api/update-profile/`,
form_data,
config
);
if (res.data.profile) {
dispatch({
type: PROFILE_UPDATE_SUCCESS,
payload: res.data,
});
dispatch(load_user());
} else {
dispatch({
type: PROFILE_UPDATE_FAIL,
});
}
} catch {
dispatch({
type: PROFILE_UPDATE_FAIL,
});
}
};
обновить профильные редукторы
export default function (state = initialState, action) {
const { type, payload } = action;
switch (type) {
case PROFILE_UPDATE_SUCCESS:
return {
...state,
email: payload.email,
phone: payload.phone,
address: payload.address,
profile_image: payload.profile_image.name,
};
case PROFILE_UPDATE_FAIL:
return {
...state,
email: "",
phone: "",
address: "",
profile_image: "",
};
default:
return {
...state,
};
}
}
Обновление профиля реактивного вызова
const [phone, setPhone] = useState("");
const [address, setAddress] = useState("");
const [profileImage, setProfileImage] = useState();
const imageChangeHandler = (e) => {
setProfileImage(e.target.files[0]);
};
const handleSubmit = (e) => {
e.preventDefault();
update_profile(phone, address, profileImage);
};