前提・実現したいこと
ReactとDjangoで簡単な記事投稿アプリを作っています。
Reactで作成した記事投稿フォームに入力するとDjangoの方にデータが追加され、記事が追加される機能を実装したいです。
発生している問題・エラーメッセージ
最後にアップロードボタンを押しても記事が投稿されずに困っています。何か問題点や解決点を下さればありがたいです。
Reactコード
イメージとしては記事投稿フォームに入力された値をState値として保持し、 定義したaddArticle関数でDjango Rest Frameworkにデータを追加するという構想です。
React
1import './Post.css'; 2import axios from 'axios'; 3// import Posts from './Posts'; 4import React, {useState,useEffect} from 'react'; 5import './Posts.css'; 6// import Avatar from '@material-ui/core/Avatar'; 7// import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 8// import { faHeart } from '@fortawesome/free-solid-svg-icons'; 9import Posts from './Posts'; 10import HomeIcon from '@material-ui/icons/Home'; 11import SearchIcon from '@material-ui/icons/Search'; 12import AddBoxIcon from '@material-ui/icons/AddBox'; 13import FavoriteIcon from '@material-ui/icons/Favorite'; 14import Avatar from '@material-ui/core/Avatar'; 15import Add from './Add'; 16import {Button,Input} from '@material-ui/core'; 17import { makeStyles } from '@material-ui/core/styles'; 18import Modal from '@material-ui/core/Modal'; 19 20 21 22function getModalStyle() { 23 const top = 50 ; 24 const left = 50 ; 25 26 return { 27 top: `${top}%`, 28 left: `${left}%`, 29 transform: `translate(-${top}%, -${left}%)`, 30 }; 31 } 32 33 const useStyles = makeStyles((theme) => ({ 34 paper: { 35 position: 'absolute', 36 width: 400, 37 backgroundColor: theme.palette.background.paper, 38 border: '2px solid #000', 39 boxShadow: theme.shadows[5], 40 padding: theme.spacing(2, 4, 3), 41 }, 42 })); 43 44 45 46 47function Post () { 48 49 const [articles , setArticles] = useState([]); 50 const [openUpload, setOpenUpload] = useState(false); 51 const [modalStyle] = useState(getModalStyle); 52 const classes = useStyles(); 53 const [image, setImage] = useState(null); 54 const [content, setContent] = useState(''); 55 const [name, setName] = useState(''); 56 57 58 59 useEffect(() => { 60 61 axios.get('http://127.0.0.1:8000/api/') 62 .then( res => { 63 const articles = res.data.map((article) => ({ 64 name: article.name, 65 content: article.content, 66 id: article.id, 67 image : article.image, 68 })); 69 setArticles(articles); 70 console.log(res.data); 71 72 }) 73 74 }) 75 76 77 78 79 const addArticle = (content, name, image) => { 80 let form_data = new FormData(); 81 82 if(image){ 83 form_data.append('image', image); 84 } 85 86 form_data.append('content', content); 87 form_data.append('name', name); 88 89 axios.post('http://127.0.0.1:8000/api/', form_data,{headers: { 90 'content-type': 'multipart/form-data' 91 } 92 }).then(res => { 93 window.location.href="/"; 94 }).catch(err => { 95 console.log(err); 96 }); 97 } 98 99 100 101 const handleSubmit = (event) => { 102 event.preventDefault(); 103 104 setContent('') 105 setImage(null) 106 setName('') 107 108 addArticle(name, content, image); 109 } 110 111 112 const nameChange = (event)=> { 113 setName(event.target.value,) 114 } 115 116 const contentChange = (event)=> { 117 setContent(event.target.value,) 118 } 119 120 const handleChange = (e) => { 121 if(e.target.files[0]) { 122 setImage(e.target.files[0]); 123 } 124 }; 125 126 127 128 129 130 131 132 return( 133 134 <div className="app"> 135 136 <Modal 137 open={openUpload} 138 onClose={() => setOpenUpload(false)} 139 > 140 <div style={modalStyle} className={classes.paper}> 141 <form className="app_sighup"> 142 <center> 143 <img 144 className="app_headerImage" 145 src="https://www.instagram.com/static/images/web/mobile_nav_type_logo.png/735145cfe0a4.png" 146 alt="" 147 /> 148 </center> 149 <Input 150 type="text" 151 placeholder="Enter a name...." 152 value={name} onChange={nameChange} 153 /> 154 <Input 155 type="text" 156 placeholder="Enter a caption...." 157 value={content} onChange={contentChange} 158 /> 159 <Input 160 type="file" 161 onChange={handleChange} 162 /> 163 <Button type="submit" onClick={handleSubmit}>Uploade</Button> 164 </form> 165 </div> 166 </Modal> 167 168 169 170 171 <div className="app_header"> 172 <img 173 className="app_headerImage" 174 src="https://www.instagram.com/static/images/web/mobile_nav_type_logo.png/735145cfe0a4.png" 175 alt="" 176 /> 177 </div> 178 <div className="app_posts"> 179 {articles.map(({name,content,id,image}) => ( 180 <Posts id={id} name={name} content={content} image={image}/> 181 )) 182 } 183 </div> 184 <div className="app__footer"> 185 {/* <div className="app__center"> */} 186 187 <HomeIcon className="footer_green"/> 188 <SearchIcon className="footer_icon"/> 189 <AddBoxIcon className="footer_icon" onClick={() => setOpenUpload(true)}/> 190 <FavoriteIcon className="footer_icon"/> 191 <Avatar 192 className="post_avatar" 193 alt="Gafe" 194 src="/static/images/avatar/1.jpg" 195 /> 196 {/* </div> */} 197 </div> 198 </div> 199 200 201 ) 202 203} 204 205export default Post;
Djangoで作成したapi
詳細
初歩的な質問で申し訳ないですが、お力を貸していただけたらと思います。
あなたの回答
tips
プレビュー