Reactjs Django rest框架,React JS,Axios-包含图像文件的Post JSON数据

Reactjs Django rest框架,React JS,Axios-包含图像文件的Post JSON数据,reactjs,django-rest-framework,axios,Reactjs,Django Rest Framework,Axios,如何使用axios将图像文件上载到Django_Rest框架 我有一个简单的模型: class Article(models.Model): title = models.CharField(max_length=120) text = models.TextField() img = models.ImageField(upload_to='article_images/', blank=True, null=True) create_time = model

如何使用axios将图像文件上载到Django_Rest框架 我有一个简单的模型:

class Article(models.Model):

    title = models.CharField(max_length=120)
    text = models.TextField()
    img = models.ImageField(upload_to='article_images/', blank=True, null=True)
    create_time = models.DateTimeField(default=datetime.utcnow, blank=True, 
    null=True
以及React JS中的简单形式:

class ArticleForm extends React.Component {
    state= {
        img: undefined
    }
    handleUpolad =(event)=>{
         event.preventDefault();
        const img=event.target.files[0];
        this.setState({
            img:img
        })
    }
    handleFormSubmit = (event)=>{
        event.preventDefault();
        const title=event.target.elements.title.value;
        const content=event.target.elements.content.value;
        Axios.post('http://127.0.0.1:8000/api/',{
            title:title,
            text:content,
                       
        }).then(res=>console.log(res))
        .catch(err=>console.log(err))
    }
    render() {
      return (
        <div>
          <Form  onSubmit={this.handleFormSubmit}>
            
            <Form.Item  label="Title"  >
              <Input placeholder="input placeholder" name='title' />
            </Form.Item>

            <Form.Item label="Content"   >
              <Input placeholder="input placeholder" name='content' />
            </Form.Item>
            
            <Form.Item label="Dragger"  >
                <div className="dropbox">            
                    <input type='file' onChange={this.handleUpolad} name='img'>                
                    </input>                     
                </div>
             </Form.Item>
             <Form.Item >
              <Button type="primary" htmlType="submit">Submit</Button>
            </Form.Item>
          </Form>
        </div>
      );
    }
  }
类ArticleForm扩展了React.Component{
状态={
img:未定义
}
handleUpolad=(事件)=>{
event.preventDefault();
const img=event.target.files[0];
这是我的国家({
img:img
})
}
handleFormSubmit=(事件)=>{
event.preventDefault();
const title=event.target.elements.title.value;
常量内容=event.target.elements.content.value;
轴心柱http://127.0.0.1:8000/api/',{
标题:标题,,
文本:内容,
}).then(res=>console.log(res))
.catch(err=>console.log(err))
}
render(){
返回(
提交
);
}
}

当我只发布标题和内容时,它的工作很好。如何使用Axios发布包含此数据的图像文件?

我认为您可以利用

另外,我认为您不需要在状态中添加图像。您可以简单地将其保留为类变量。如果设置状态-将不需要重新渲染。为什么不避免呢

以下是修改后的代码和一些注释:

class ArticleForm extends React.Component {
  pickedFile = null; // save the picked file in this

  handleUpolad = event => {
    event.preventDefault();
    this.pickedFile = event.target.files[0];
  }

  handleFormSubmit = event => {
    event.preventDefault();

    let data = new FormData(); // creates a new FormData object
    data.append('title', event.target.elements.title.value);
    data.append('text', event.target.elements.content.value);
    data.append('img', this.pickedFile); // add your file to form data

    Axios.post('http://127.0.0.1:8000/api/', data)
    .then(res=>console.log(res))
    .catch(err=>console.log(err))
  }

  render() {
    // your usual code
  }
}

我想你可以利用这个机会

另外,我认为您不需要在状态中添加图像。您可以简单地将其保留为类变量。如果设置状态-将不需要重新渲染。为什么不避免呢

以下是修改后的代码和一些注释:

class ArticleForm extends React.Component {
  pickedFile = null; // save the picked file in this

  handleUpolad = event => {
    event.preventDefault();
    this.pickedFile = event.target.files[0];
  }

  handleFormSubmit = event => {
    event.preventDefault();

    let data = new FormData(); // creates a new FormData object
    data.append('title', event.target.elements.title.value);
    data.append('text', event.target.elements.content.value);
    data.append('img', this.pickedFile); // add your file to form data

    Axios.post('http://127.0.0.1:8000/api/', data)
    .then(res=>console.log(res))
    .catch(err=>console.log(err))
  }

  render() {
    // your usual code
  }
}