質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

754閲覧

Django Rest Frameworkにアップロード画面からデータを追加したい。

yasso

総合スコア6

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/03/25 01:51

前提・実現したいこと

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

イメージ説明

詳細

初歩的な質問で申し訳ないですが、お力を貸していただけたらと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問