vue前端与Django后端数据交互

现在接触的项目是vue作为前端,Django作为后端的。二者之间的数据交互是二者连接起来的关键,这里以get为例,vue将后端拿到的数据进行展示。万事开头难,加油~

后端

数据库

这是数据库中的数据,我们从中以文章获得的stars为标准,选出star最多的五篇文章传到前端作为topArticle进行展示。(里面的数据随便造的,不要在意这些细节)
在这里插入图片描述

models.py

这是文章的model

# 文章
class Article(models.Model):
    # author_id = models.IntegerField(default=0)  # 创建者id
    # algorithm_id = models.IntegerField(default=0)  # 文章类型id
    content = models.TextField(max_length=32765)  # 发布文章内容
    title = models.CharField(max_length=100)  # 文章题目
    author = models.CharField(max_length=100)  # 默认为创建者
    date = models.DateTimeField(auto_created=True)  # 默认为创建的时间
    last_alter = models.DateTimeField(auto_created=True, default=timezone.now)  # 默认为最后一次提交修改
    algorithm = models.CharField(max_length=20)  # 文章类型
    stars = models.IntegerField(default=0)  # 被点赞次数
serializers.py

这是使用drf框架需要进行新创建的文件

class ArticleModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

    def create(self, validated_data):
        return Article.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.content = validated_data.get('content', instance.content)
        instance.title = validated_data.get('title', instance.title)
        instance.author = validated_data.get('author', instance.author)
        instance.date = validated_data.get('date', instance.date)
        instance.last_alter = validated_data.get('last_alter', instance.last_alter)
        instance.algorithm = validated_data.get('algorithm', instance.algorithm)
        instance.stars = validated_data.get('stars', instance.stars)
        # instance.author_id = validated_data.get('author_id', instance.author_id)
        # instance.algorithm_id = validated_data.get('algorithm_id', instance.algorithm_id)
        instance.save()
        return instance
views.py

这里为前端创建了接口,数据从数据库取出并进行处理。

class ArticleViewSet(ModelViewSet):
    parser_classes = [MultiPartParser, JSONParser, FormParser]
    """视图集"""
    queryset = models.Article.objects.all()
    serializer_class = ArticleModelSerializer
    # 搜索
    search_fields = ('id')

    @action(methods=['get'], detail=False)
    def topArticles(self, request, *args, **kwargs):
        obj = models.Article.objects.all().order_by('stars')[:5]
        if obj:
            ser = ArticleModelSerializer(instance=obj, many=True)
            return JsonResponse({
                'code': '200',
                'msg': '获取数据成功',
                'data': ser.data
            })
        else:
            return JsonResponse({
                'code': '1002',
                'msg': '获取失败',
            })
后端测试

因为是get操作,我们直接在浏览器中进行操作访问,数据可以拿到。
在这里插入图片描述

前端

前后端代理问题

这里不进行赘述,具体可以参考这篇文章----->传送门

vue.config.js

不同的版本,文件不同,在module.exports 中加入下面代码,即代理,Django的端口号默认为8000.

devServer: {
        proxy: {
            '/api': {
                target: 'http://localhost:8000',
                changeOrigin: true,
                ws: true,
                pathRewrite: {
                    '^/api': ''
                }
            }
        }
    },

api 文件

这个文件是自己建立的,名字默认为api,在src文件夹下

data.js

用于书写与后端交互的函数

import request from "@/utils/request"

export function getTopArticle() {
    return request({
        url: 'article/topArticles/',
        method: 'get',
    })
}
前端页面

这里给出部分代码,因为涉及到其他地方。

<template>
<top-news class="news" :news="news"></top-news></template>

<script>
import TopArticles from "@/components/home/components/TopArticles";
import {getTopArticle} from "@/api/data";

export default {
  name: "HomeComponents",
  components: {TopCoders, TopArticles, ComingCompetitions, TopNews},
  data() {
    return {
    topArticle: []
    }
  },
  created() {
    this.getData();
  },
  methods: {
    getData() {
      getTopArticle().then(res => {
        this.topArticle = res.data;
      })
    }
  }
}
</script>
topArticles.vue
<template>
  <div>
    <sui-card style="width: 90%;left: 5%">
      <sui-card-content>
        <div class="coders" style="margin-left: 0;">
          <ai></ai>
          <span class="title" style="margin-left: 0;"><strong>TOP ARTICLES</strong></span></div>
        <div class="ui divider"></div>
        <sui-list>
          <sui-list-item v-for="(item, key) in topArticles">
            <div style="display: flex">
              <img src="https://himg.bdimg.com/sys/portraitn/item/72a1ced6ccd8b0accec4b6f94cdbed">
              <div style="justify-items: center">
                <span style="font-size: 18px">{{ item.title }}</span>
                <br>
                <span style="color:gray">Author:{{ item.author }}</span>
              </div>
            </div>
          </sui-list-item>
        </sui-list>
      </sui-card-content>

    </sui-card>
  </div>
</template>

<script>
export default {
  name: "topArticle",
  props: {
    topArticles: {
      // 指定类型
      Type: Array,
      required: true
    },
  },
}
</script>

<style scoped>

</style>

展示结果:

在这里插入图片描述

  • 23
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DjangoVue.js是两个非常流行的Web开发框架,分别用于后端前端开发。它们可以很好地进行数据交互,使得前后端之间的数据传输变得简单和高效。 在Django后端,我们可以使用Django的REST框架来创建API接口,将数据以JSON格式返回给前端。通过定义序列化器,我们可以将Django模型转换为JSON格式并向前端发送数据前端可以通过HTTP请求向后端获取数据,并进行增删改查等操作。 在Vue.js前端,我们可以使用Axios库来进行HTTP通信。通过发送HTTP请求,可以从Django后端获取数据,并在前端进行展示和处理。在Vue组件中,我们可以使用Axios来发送GET、POST、PUT等不同类型的请求,与后端进行数据交互。获取到数据后,可以使用Vue数据绑定功能来动态展示数据。 同时,为了更好地处理数据交互,可以使用Vuex来进行状态管理。Vuex可以在前端应用中集中存储和管理数据,使得数据在不同组件间的共享和传递变得更加便捷。通过Vuex,前端可以将从后端获取的数据存储在全局状态中,并在不同组件中进行共享和使用。 综上所述,通过DjangoVue.js,前后端数据交互变得非常简单和高效。Django提供了强大的API接口,将数据以JSON格式发送给前端,而Vue.js可以通过Axios库进行HTTP通信,与Django进行数据交互实现前后端的无缝对接。同时,通过Vuex可以方便地进行数据管理和共享。这样的数据交互机制可以为开发者提供更好的开发体验,同时也提高了应用的性能和可维护性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值