Django is not creating any fields with users created manually
i've created a eccomerce website. this has a registration page where users creates their user account & then can order anything. if i create a user from admin panel, then everything works perfectly. but if i create a user from front end of my registration page using React js, then that user can't order anything, meaning when i post a data using fetch django doesn't store or create any data for that user. why? what's the issue here? i'm using Rest Api in backend & posting data through fetch to send data. but the fetch fails but not if i use a user which was created from admin panel(./admin). am i doing anything wrong in creating the user data manually at my views???
#my_views
from django.shortcuts import redirect
from django.contrib.auth.hashers import make_password
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from App.models import *
from api.forms import RegisterForm
from .serializers import *
from django.contrib.auth.models import User
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# Add custom claims
token['username'] = user.username
# ...
return token
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
@api_view(['GET','POST'])
def getRoutes(request):
routes = [
'/api/token',
'/api/refresh',
]
return Response(routes)
@api_view(['POST'])
def getUserData(request):
if request.method == 'POST':
serializer = userSerializers(data={"username":request.data['username'],"email":request.data["email"],"password":make_password(request.data['password'])})
if serializer.is_valid():
serializer.save()
username = request.data['username']
email = request.data['email']
user = User.objects.get(username=username,email=email)
form = Customer.objects.create(name=username,email=email,user=user)
print(request.data)
if request.method == 'GET':
user = User.objects.all()
serializer = userSerializers(user,many=True)
return Response(serializer.data)
@api_view(['GET','POST'])
def getCustomerData(request):
if request.method=='GET':
customer = Customer.objects.all()
serializers = customerSerializers(customer,many=True)
return Response(serializers.data)
if request.method=='POST':
serializers = customerSerializers(data=request.data)
if serializers.is_valid():
serializers.save()
return Response(serializers.data)
@api_view(['GET'])
def getProductData(request):
item = Product.objects.all()
serializer = productSerializers(item,many=True)
return Response(serializer.data)
@api_view(['GET','POST'])
def getOrderData(request):
if request.method == 'GET':
item = Order.objects.all()
serializer = orderSerializers(item,many=True)
if request.method == 'POST':
serializer = orderSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
@api_view(['GET','POST'])
def getOrderItemData(request):
if request.method=='GET':
item = OrderItem.objects.all()
serializer = orderItemSerializers(item,many=True)
if request.method=='POST':
print(request.data)
serializer = orderItemSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
@api_view(['GET','POST'])
def getShippingAddressData(request):
if request.method == 'GET':
item = ShippingAddress.objects.all()
serializer = shippingAddressSerializers(item,many=True)
if request.method == 'POST':
serializer = shippingAddressSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
serializers.py
from pyexpat import model
from rest_framework import serializers
from App.models import *
from django.contrib.auth.models import User
class userSerializers(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class productSerializers(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
class customerSerializers(serializers.ModelSerializer):
class Meta:
model = Customer
fields = '__all__'
class orderSerializers(serializers.ModelSerializer):
class Meta:
model = Order
fields = '__all__'
class orderItemSerializers(serializers.ModelSerializer):
class Meta:
model = OrderItem
fields = '__all__'
class shippingAddressSerializers(serializers.ModelSerializer):
class Meta:
model = ShippingAddress
fields = '__all__'
front-end registration page:
import React,{useState} from 'react'
import { useGlobalContext } from './Context'
import {Link, useNavigate} from 'react-router-dom'
import './registration.css'
const userCreateUrl = 'http://127.0.0.1:8000/api/get-user-data/'
export default function Register() {
const {loginUser} = useGlobalContext()
const [username,setUsername] = useState('')
const [email,setEmail] = useState('')
const [password1,setPassword1] = useState('')
const [password2,setPassword2] = useState('')
const [processing,setProcessing] = useState(false)
const history = useNavigate()
const registerUser = async (e)=>{
e.preventDefault()
setProcessing(true)
fetch(userCreateUrl,{
method:'POST',
headers:{
'Content-Type':'application/json',
},
body:JSON.stringify({username:username,email:email,password:password1,password:password2})
}
)
setTimeout(()=>{
history('/login')
},3000)
}
return (
<div className="registration">
<img src="https://images-na.ssl-images-amazon.com/images/G/01/gc/designs/livepreview/a_generic_white_10_us_noto_email_v2016_us-main._CB627448186_.png" className='login-logo' alt="Amazon Logo" />
<div className="login-container">
<Link to='/' style={{marginBottom:'0rem'}}>Back</Link>
<h3>Create a new account</h3>
<form className="form" onSubmit={registerUser}>
<h5>Username:</h5>
<input type="text" value={username} name='username' onChange={(e)=>setUsername(e.target.value)} />
<h5>Email:</h5>
<input type="email" value={email} name='email' onChange={(e)=>setEmail(e.target.value)} />
<h5>Password:</h5>
<input type="password" value={password1} name='password1' onChange={(e)=>setPassword1(e.target.value)} />
<h5>Password:</h5>
<input type="password" value={password2} name='password' onChange={(e)=>setPassword2(e.target.value)} />
<button className="login-btn" type='submit'>{processing ? 'Processing...' : "Sing-Up"}</button>
{/* <p className="terms">By continuing, you agree to Amazon's Conditions of Use and Privacy Notice.</p>
<div className="new-acc">
<p className='new'>New to Amazon?</p>
<hr />
<br />
<button className="create-btn">Create Your Amazon Account</button>
</div> */}
</form>
</div>
</div>
)
}
The problem is that in your view getUserData that you use to create a user, you are not creating an instance of the User model, you are querying for one using User.objects.get(). Since the user does not exists yet, the view will raise a DoesNotExist error.
I'm not sure about the purpose of using the User model and the Customer model. Maybe the best choice would be to create a custom user model.
If you still want to user the default user model, you should create the user using User.objects.create_user(username=username, password=password) like suggested on the documentation