【发布时间】:2022-08-03 02:04:08
【问题描述】:
我创建了一个电子商务网站。这有一个注册页面,用户可以在其中创建他们的用户帐户,然后可以订购任何东西。如果我从管理面板创建用户,那么一切正常。但是如果我使用 React js 从我的注册页面的前端创建一个用户,那么该用户不能订购任何东西,这意味着当我使用 fetch django 发布数据时不会为该用户存储或创建任何数据。为什么?这里有什么问题?我在后端使用 Rest Api 并通过 fetch 发布数据以发送数据。但是如果我使用从管理面板(./admin)创建的用户,则获取失败但不会。在我看来手动创建用户数据时我做错了吗???
#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)
序列化程序.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__\'
前端注册页面:
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>
)
}
标签: python reactjs django django-models django-rest-framework