将数据从 React Js 发布到 Django Rest

Post data from React Js to Django Rest

提问人:Muhammad Nabeel 提问时间:2/14/2019 最后编辑:Muhammad Nabeel 更新时间:2/14/2019 访问量:2453

问:

我正在尝试将数据从 react js 发布到 django rest api,但收到 http 400 错误请求错误(“由于语法无效,服务器无法处理请求。

我试过重构我的代码,却找不到问题出在哪里,下面我的代码是

class Postjob extends React.Component{
constructor(props){
    super(props);
    this.submitForm=this.submitForm.bind(this);
    this.postedjob=this.postedjob.bind(this);
    this.state={
        Company:0,
        job_title:"",
        job_description:"",
        salary:0,
        job_status:false,
    }
}

submitForm= (evt) =>{
    evt.preventDefault()
    console.log(this.state.Company)
    const form={
        Company: this.state.Company,
        job_title: this.state.job_title,
        job_description: this.state.job_description,
        salary: this.state.salary,
        job_status: this.state.job_status
    };

    this.postedjob(form)

};

postedjob = (payload)=>{


    fetch(`http://127.0.0.1:8000/job/create_job/`,
        {
            method: 'POST',
            body: JSON.stringify(payload),
            headers: {
                'Content-Type': 'application/json'
            }
        }
    ).then(response => response.json())
};

render() {
    return(
        <div>
            <h1>{this.state.currenttask}</h1>
            <form onSubmit={this.submitForm}>

                <input type='number' value={this.state.Company} onChange={e=>this.setState({Company:e.target.value})}/>

              <input type='text' value={this.state.job_title} onChange={e=>this.setState({job_title:e.target.value})}/>


                <input type='text' value={this.state.job_description} onChange={e=>this.setState({job_description:e.target.value})}/>

                <input type='number' value={this.state.salary} onChange={e=>this.setState({salary:e.target.value})}/>

                <button type="submit">Submit</button>

          </form>

        </div>
    )
}

}

Django Side:

Views.py:

lass Companylist(APIView):

 def get(self,request):
   return Response([CompanySerializer(company).data for company in Company.objects.all()])

  def post(self,request):
   payload=request.data
   serializer=CompanySerializer(data=payload)

   if serializer.is_valid():
       serializer.save()
       return Response(serializer.data,status=status.HTTP_201_CREATED)
   return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

Serializers.py:

class CompanySerializer(serializers.ModelSerializer):

class Meta:
    model=Company
    fields='__all__' #to get all fields

def create(self, validated_data):
    company = Company.objects.all(**validated_data)
    return company

def update(self, instance, validated_data):
    for k, v in validated_data.items():
        setattr(instance, k, v)
        instance.save()
    return instance

def validate(self, attrs):
    if not attrs.get('company_name') or attrs.get('company_name') < 10:
        raise ValidationError("Book is too small to read")
    return attrs

我尝试从 django api 发帖并且它正在成功运行,但是当我尝试从 react js 表单时,它给了我错误,我找不到原因。 如果有人能找到错误的原因,将不胜感激。

reactjs django-rest-framework

评论

0赞 Logan Bertram 2/14/2019
你能分享一下 Django 方面的情况吗?
0赞 Muhammad Nabeel 2/14/2019
Django 部分共享。
0赞 philipjc 2/17/2019
很高兴看到你的 Django 模型,拜托。你的模型中有外键吗?如果是这样,序列化需要增加深度。
0赞 philipjc 2/17/2019
此外,您的表单字段中没有一个 name 属性,该属性是填充 request.data 的属性。另外,我建议研究 React 类属性,这将阻止您不必绑定构造函数。

答:

0赞 Eddie Cooro 2/14/2019 #1

这是因为将有效负载序列化为 json 时类型错误。 你确定一切吗?服务器上的“公司”字段是否以大写字母开头?它应该是一个数字吗?如果是这样,则在字符串化有效负载时应注意状态值的类型。

例如,onChange 的 event.target.value 中提供的值将具有类型字符串,即使输入类型为 number

你还想看看我创建的这个 CodeSandbox