【问题标题】:Django is not creating any fields with users created manuallyDjango 没有使用手动创建的用户创建任何字段
【发布时间】: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


    【解决方案1】:

    问题是,在您用于创建用户的getUserData 视图中,您并没有创建用户模型的实例,而是使用User.objects.get() 查询一个实例。由于用户还不存在,视图将引发 DoesNotExist 错误。

    我不确定使用 User 模型和 Customer 模型的目的。也许最好的选择是创建一个custom user model

    如果您仍想使用默认用户模型,您应该使用User.objects.create_user(username=username, password=password) 创建用户,就像documentation 上的建议一样

    您可以发布您认为print(request.data) 的输出吗?

    【讨论】:

    • 但我在那里使用序列化程序创建用户... serializer = userSerializers(data={"username":request.data['username'],"email":request.data["email"],"password":make_password (request.data['password'])}) if serializer.is_valid(): serializer.save() 不是一种有效的创建方式吗?
    • 无论如何,我按照您要求我设置用户创建的方式进行了操作。 &这很好,但它仍然没有解决我的问题。 django 仍然没有保存这些用户的数据
    猜你喜欢
    • 2016-11-28
    • 1970-01-01
    • 2018-06-23
    • 2016-09-29
    • 1970-01-01
    • 2012-04-23
    • 2018-11-26
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多