1. 程式人生 > >使用django和vue進行數據交互

使用django和vue進行數據交互

com 狀態 method tag comm 文章 json tor 目錄

一、前端請求的封裝

1.將請求地址封裝起來,以便日後修改,在src/assets/js目錄下創建getPath.js文件

export default function getUrl(str) {
  let url = http://localhost:8000/ + str;
  return url;
}

2.在同一個目錄下創建axios.js文件

我的前端數據交互使用的模塊使用的是axios

import axios from axios
import getUrl from ./getPath
export default {
    Get: (config) => {
        axios({
            methods: 
"get", url: getUrl(config.url), params: config.params }).then((res) => { stateDetection(res); config.callback && config.callback(res); }) }, Post: () => { axios({ methods: "post", url: getUrl(config.url) }).then((res)
=> { stateDetection(res); config.callback && config.callback(res); }) } } //狀態檢測 let stateDetection = (data, callback) => { let status = data.status_code; switch (status) { case 102: break; case 103: alert(data.content);
break; case 404: window.location.href = data.url; break; } }

二、前端Get請求使用

1.在src/store/目錄下的ArchiveStore.js文件引入axios模塊

import axios from ../assets/js/axios

2.在src/store/目錄下的ArchiveStore.js文件裏的state添加文章詳情的數據結構

 specific: {
            browse: 0,
            content: ‘‘,
            title: ‘‘,
            date: ‘‘,
            tags: []
        }, //文章詳情

3.在src/store/目錄下的ArchiveStore.js文件裏創建一個action方法

        getArticlesSpecific({ commit, state }, id) { //得到指定文章詳情
            axios.Get({
                url: get_article_specific,
                params: {
                    id: id
                },
                callback: (res) => {
                    // console.log(res);
                    let data = res.data
                    state.specific = {
                        browse: data[browse],
                        content: data[content],
                        title: data[title],
                        date: data[date],
                        tags: data[tags]
                    }
                    state.loading = false;
                    //   specific
                }
            })

        }

4.在文章詳情頁面Specificartical.vue(src/components)下執行getArticlesSpecific方法即可

<template>
    <div class="specificartical borderStyle container" >
        <h1 class=title>{{specific.title}} </h1>
        <div class=content>
             <div><span class=annotation><i></i>{{specific.date}}</span>/
            <span class=annotation><i></i>{{specific.browse}}</span>/
            <div>{{specific.content}}</div>
            <div class=attention><i>@</i></div>
            <div class=lable><i>*</i><a v-for="(tag,index) in specific.tags" :key="index">{{index!=0?,:‘‘}}{{tag}}</a></div>
        </div>
       
    </div>
</template>

<script>
import {mapState,  mapActions} from vuex
export default {
  name: specificartical,
   computed: {
    ...mapState({
        specific:state=>state.ArchiveStore.specific,
    })
  },
  methods:{
    ...mapActions([
       getArticlesSpecific
    ]), 
  },
  activated:function(){this.getArticlesSpecific(this.$route.params.id);
  }
}
</script>

在這裏要註意的是使用activated生命周期函數,該函數會在keep-alive,組件被激活時調用

三、後端Get請求使用

1.在urls.py(djangoBlog)文件下面引入views.py裏面的方法

from blog.views import *

2.註冊url

from blog.views import *
urlpatterns = [
    url(r^get_article_specific/$, getArticleSpecific, name=get_article_specific),
]

3.在views.py裏面導入需要用到的模塊和models

from blog.models import *
from django.http import JsonResponse
from django.db.models.functions import TruncDate

4.在views.py裏面添加getArticleSpecific方法

#得到文章詳情
def getArticleSpecific(request):
    results={}
    #得到標簽數組
    temp=list(Article.objects.get(id=request.GET[id]).tag.values_list(name)  )
    results[tags]=[]
    #處理標簽數組的格式
    for value in temp:
        results[tags].append(value[0])
    #得到文章詳情
    data=Article.objects.annotate(date=TruncDate(create_time)).values(title,content,browse,date).get(id=request.GET[id])
    results[browse]=data[browse]
    results[title]=data[title]
    results[content]=data[content]
    results[date]=data[date]
    results[status_code]=102
    return JsonResponse(results, safe=False)

使用django和vue進行數據交互