使用React的Django REST:使用FormData的axios PATCH不更新任何数据

时间:2020-05-02 19:33:13

标签: django reactjs django-rest-framework axios

我正在尝试制作一个可编辑用户个人资料数据并使用patch方法更改除用户名以外的所有字段的表单,因为用户名是主键,并且仅是特定用户的标识符。

更新:

-我将其更改为常规的PATCH方法,并且数据未更新

-我还确保formData发送正确的数据,

通过阅读先前的问题,我了解到普通的 axios.patch 方法不适用于 FormData ,并且我已经按照添加的说明进行操作:

formData.append(“ _ method”,“ PATCH”)

并将axios方法更改为 axios.put ,但是,我仍然在数据部分收到400错误,指出:

用户名:[“此字段为必填。”]

我们将不胜感激。谢谢,好心的陌生人!

编辑个人资料提交:

  onSubmit = (e) => {
    e.preventDefault();
    const { firstName, lastName, profile } = this.state;
    const username = localStorage.getItem("username");
    formData.append("_method", "PATCH");
    formData.append("firstName", firstName);
    formData.append("lastName", lastName);
    formData.append("profile_picture", profile);
    this.props.onUpdate(formData, username);
  };

Axios请求

export const userUpdate = (formData, username) => {
  axios
    .post(`http://127.0.0.1:8000/user/api/${username}`, {
      formData,
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
    })
    .then((response) => {
      console.log(response);
    })
    .catch((error) => {
      console.log(error.response);
    });
};

用户模型。py

class User(models.Model):
    firstName = models.CharField(max_length = 20, blank = True, default='Anonymous')
    lastName = models.CharField(max_length = 25, blank = True, default='')
    username = models.CharField(max_length = 50, unique=True, primary_key=True)
    profile_picture = models.ForeignKey('upload.Profile', on_delete=models.CASCADE, null=True)

个人资料图片模型。py

class Profile(models.Model):
    image = models.ImageField(blank=False, null=False, upload_to=profile_path, default='f_profile.jpg')

1 个答案:

答案 0 :(得分:0)

如果您需要PATCH请求,则应该使用patch

export const userUpdate = (formData, username) => {
  axios
    .patch(`http://127.0.0.1:8000/user/api/${username}`, {
      formData,
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
    })
    .then((response) => {
      console.log(response);
    })
    .catch((error) => {
      console.log(error.response);
    });
};

此外,从表单中删除_method。除非您有特定的观点来做点什么,否则您将不需要它。