【发布时间】:2019-09-16 18:47:12
【问题描述】:
我是 Django 新手,希望这对高级用户来说是一个简单的问题。 我正在尝试使用 React 表单(前端)向 Django rest API 中的嵌套对象提交 post/put 请求。
下面是嵌套对象的样子,表名为person。它加入地址表以获取街道、郊区等信息。
{
"id": 3,
"last_name": "Kidd",
"first_name": "Jason",
"address": [
{
"id": 5,
"street": "13 Sunrise Road",
"suburb": "Greenhithe",
"town": "Christchurch",
"postcode": "2234",
"address_type": "w"
}
],
"group": "Customer"
}
我使用了一个名为drf_writable_nested 的包来写入嵌套对象。这是person serializer 的代码。
from drf_writable_nested import WritableNestedModelSerializer
class PersonSerializer(WritableNestedModelSerializer):
last_name = serializers.CharField(required=True, max_length=100)
first_name = serializers.CharField(required=True, max_length=100)
address = AddressSerializer(many=True)
class Meta:
model = Person
fields = ('id', 'last_name', 'first_name', 'address', 'group')
下面是处理提交请求的前端代码,如果它提交的对象是平面的(不是嵌套的),这种模式可以正常工作。
class ClientForm extends React.Component {
handleFormSubmit = (event, requestType, id) => {
event.preventDefault();
const last_name = event.target.elements.last_name.value;
const first_name = event.target.elements.first_name.value;
console.log(last_name, first_name);
switch ( requestType ) {
case 'post':
return axios.post('http://127.0.0.1:8000/api/person/', {
last_name: last_name,
first_name: first_name
})
.then(res => console.log(res))
.catch(error => console.err(error));
case 'put':
return axios.put(`http://127.0.0.1:8000/api/person/${id}/`, {
last_name: last_name,
first_name: first_name
})
.then(res => console.log(res))
.catch(error => console.error(error));
}
}
render() {
return (
<div>
<Form onSubmit={(event) => this.handleFormSubmit(
event,
this.props.requestType,
this.props.id)}>
<Form.Item label="Last name" style={{width: "250px"}}>
<Input name="last_name" placeholder="Enter surname here" />
</Form.Item>
<Form.Item label="First name" style={{width: "250px", textAlign: 'center'}} >
<Input name="first_name" placeholder="Enter first name here" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">Submit</Button>
</Form.Item>
</Form>
</div>
);
}
}
export default ClientForm;
我的问题是我应该如何修改它以使其与嵌套对象一起使用?如果无法修改,还有什么替代方法?在表单中,我希望有 last name、first name、street、suburb、town 等字段来向 API 提交信息。
任何帮助将不胜感激!谢谢。
【问题讨论】:
-
您是否尝试使用嵌套请求正文从 POSTMAN 调用您的 Django API?
-
@VaibhavSingh 嘿,伙计,感谢您的回复。不,zubhav 的解决方案看起来更简单。我会先尝试,如果不起作用,我会探索 POSTMAN
标签: python django reactjs django-rest-framework