微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将Draftjs的内容发布到数据库

如何解决如何将Draftjs的内容发布到数据库

我正在一个以reactjs为前端的项目中,在该项目中我有文章,而对于文章正文,我使用Draftjs作为编辑器将文本和图片放在一起,为此,我使用react-draft-wysiwyg包,它在前端方面很好,但我不知道如何将结果保存到数据库。我的后端是用于创建rest api的Django和django-rest-framework。这是CreateArticle.js:

import React,{ useState,useEffect,useCallback } from 'react'
import { usedispatch,useSelector } from 'react-redux'
import { unwrapResult } from '@reduxjs/toolkit'

import { useHistory } from "react-router-dom";

import { addNewArticle } from './managementSlice'

import { selectUser } from '../authentications/authenticationsSlice'

import './CreateArticle.scss';
import { selectAllSubjects,fetchSubjects } from '../subjects/subjectsSlice';
import { selectAllTags,fetchTags } from '../tags/tagsSlice';



import {EditorState,convertToRaw} from "draft-js";
import {Editor} from "react-draft-wysiwyg"

import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';

export const CreateArticle = () => {

  const [title,setTitle] = useState('')
  const [photo,setPhoto] = useState('')

  const [slug,setSlug] = useState('')
  
  const [subjectId,setSubjectId] = useState(0)
  const [tags,setTags] = useState([])

  const [addRequestStatus,setAddRequestStatus] = useState('idle')

  const user = useSelector(selectUser);
  const subjects = useSelector(selectAllSubjects)
  const allTags = useSelector(selectAllTags)

  const subjectStatus = useSelector((state) => state.subjects.status)
  const tagStatus = useSelector( (state) => state.tags.status)
  
  const [editorState,setEditorState] = React.useState(
    () => EditorState.createEmpty(),);



  const dispatch = usedispatch()

  const onSubjectChanged = (e) => setSubjectId(e.target.value)

  const onTitleChanged = (e) => {
    setTitle(e.target.value) 
    setSlug(e.target.value.toLowerCase().replace(" ","-"))}

    const onPhotochanged = (e) => {
      setPhoto(e.target.files[0])
      console.log(e.target.files[0]);
    }

  const onTagsChanged = (e) => {
    const selectedOptions = [...e.target.selectedOptions].map(o => parseInt(o.value))
    setTags(selectedOptions)
  }
  let history = useHistory();



 
 function uploadFileCallBack(file) {
   return new Promise(
     (resolve,reject) => {
      if (file) {
         let reader = new FileReader();
         reader.onload = (e) => {
             resolve({ data: { link: e.target.result } })
         };
         reader.readAsDataURL(file);
     }
      }
   );
 }

 const onEditorStateChange = (editorState) => {
  const contentState = editorState.getCurrentContent();
  console.log('content state',convertToRaw(contentState));
   setEditorState(editorState);
 };


  const onSaveArticleClicked = async () => {
   
    const contentState =  convertToRaw(editorState.getCurrentContent());
    let article = { subject:subjectId,title: title,body: contentState,tags:tags,photo:photo,slug:slug } 


    if (user){
      try {
        setAddRequestStatus('pending')
        console.log('addRequestStatus:',addRequestStatus)
        const resultAction = await dispatch( addNewArticle(article) )
      
        unwrapResult(resultAction)
        setTitle('')
        // setBody('')
        setTags([])
        setSubjectId('')
        setSlug('')
        history.push("/management")
      } catch (err) {
        console.error('Failed to save the article: ',err)
      } finally {
        setAddRequestStatus('idle')

      }
    }
    
  }



  useEffect( () => 
  {
    if (subjectStatus === 'idle') {
      dispatch(fetchSubjects())
    }
  },[subjectStatus,dispatch]
  )

  let subjectsOptions
  
  if (subjectStatus === 'loading') {

    subjectsOptions = <div className="loader"> Loading... </div>

  } else if (subjectStatus === 'succeeded') {

    subjectsOptions = subjects.map((subject) => (
      <option key={subject.id} value={subject.id} >
        {subject.title}
      </option>
    ))

  } else if (subjectStatus === 'error') {
    subjectsOptions = <div> Something went wrong </div>
  }


  useEffect( () => 
  {
    if (tagStatus === 'idle') {
      dispatch(fetchTags())
    }
  },[tagStatus,dispatch]
  )

  let tagsOptions
  
  if (tagStatus === 'loading') {

    tagsOptions = <div className="loader"> Loading... </div>

  } else if (tagStatus === 'succeeded') {

    tagsOptions = allTags.map((tag) => (
      <option key={tag.id} value={tag.id} >
        {tag.title}
      </option>
    ))

  } else if (tagStatus === 'error') {
    tagsOptions = <div> error </div>
  }



  return (
    <div className="create-article">
      <div className="create-article-head">

      </div>
      <form className="create-article-form" >
        <label htmlFor="article-title">Article Title:</label>
        <input
          type="text"
          className="article-title-input"
          id="id-article-title-input"
          name="title"
          placeholder="What's on your mind?"
          value={title}
          onChange={onTitleChanged}
        />

        <label htmlFor="article-photo" > Article photo: </label>
        <input
          type="file"
          className="article-photo-input"
          id="id-article-photo-input"
          // name="photo"
          placeholder="What's on your mind?"
          // value={photo}
          onChange={onPhotochanged}
        />
        <label htmlFor="article-subject">subject:</label>
        <select 
          id="id-subjects-article-select" 
          className="subjects-article-select" 
          onChange={onSubjectChanged}>
          <option value="">
            انتخاب موضوع
          </option>
          {subjectsOptions}
        </select>

        <label htmlFor="article-tags">tags:</label>
        <select 
          id="id-tags-article-select" 
          className="tags-article-select" 
          onChange={onTagsChanged}
          multiple
        >
          <option value="">
            SELECT TAGS
          </option>
          {tagsOptions}
        </select>

        <Editor
          

          wrapperClassName="easy-editor"
          editorState={editorState}
          onEditorStateChange={onEditorStateChange}    
          toolbar={{
            inline: { inDropdown: true },list: { inDropdown: true },textAlign: { inDropdown: true },link: { inDropdown: true },history: { inDropdown: true },image: { 
              uploadCallback: uploadFileCallBack,alt: { present: true,mandatory: true },previewImage: true,},}}
      />

        <button 
          type="button" 
          onClick={onSaveArticleClicked} 
          
        >
          Save Article
        </button>
      </form>
    </div>
  )
}

如果您能帮助我保存它,那就太好了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。