学习网站项目学习 - Django & Vue - 前端数据渲染、前端带参转跳

目录

一、前端数据展示

 二、前端带参跳转,后端获取参数

 2-1 前端代码

2-2 后端代码

 2-3 前端展示

三、路由跳转参数显示设置


一、前端数据展示

思路总结:

  1. 前端mounted 绑定方法,加载页面即发送数据请求到后端
  2. 后端接受请求处理,根据路由,执行视图函数。
  3. 实例化MyResponse对象,生成基于RESTful规范的数据字典
  4. 通过DRF序列化组件,处理数据
  5. 处理数据逻辑
  6. 结果存于MyResponse对象实力中,通过Response进行返回
  7. 前端取出后台传输数据,response.data内
  8. 前端通过{{}}进行渲染

'''
后端路由
'''
 url(r'^course/$', Course.Course.as_view({'get':'get_list'})),

'''
MyResponse 数据返回字典类
'''
class MyResponse():
    '''
    通用的返回类,实例化后可以将内部的属性变成字典形式传输;
    即,{status='100',msg=None}
    使用get_dic方法可以获取字典
    '''
    def __init__(self):
        self.status = 100
        self.msg = None

    @property
    def get_dic(self):
        return self.__dict__
'''
MySerializers DRF序列化组件
'''
class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Course
        fields = '__all__'

'''
视图函数
'''
class Course(ViewSetMixin, APIView):

    def get_list(self, request, *args, **kwargs):
        # 实例化MyResponse,即生成结束字典
        response = MyResponse()
        course_list = models.Course.objects.all()
        course_ser = MySerializers.CourseSerializer(instance=course_list, many=True)
        response.msg = '查询成功'
        response.data = course_ser.data

        return Response(response.get_dic)

 

 二、前端带参跳转,后端获取参数

思路总结:

 2-1 前端代码

  1. 前端链接发送跳转请求
    <!--跳转路由courseDetail,携带参数params,注意params key名不可变-->
    <router-link :to="{'name':'courseDetail','params':{'id':course.id}}">详情</router-link>
  2. 配置转跳路由(vue)
  3. 跳转网页监听路由变化,获取参数
  4. 跳转页面带参执行方法,将参数给予后台
  5. 后台接受设置有名分组,接受参数
    url(r'^course/$', Course.Course.as_view({'get':'get_list'})),
    url(r'^course/(?P<pk>\d+)', Course.Course.as_view({'get': 'get_detail'})),
  6. 后台执行视图函数,通过Response返回前台
  7. 前端接受数据渲染
<template>
    <div class="courseDetail">
        <h1>courseDetail页面</h1>
        <h4>当前页id</h4>{{course_id}}
        <h4>后端传输的所有数据</h4>{{course_detail}}

        <div>
            <h4>课程名称</h4>
            <h5>{{course_detail.course_name}}</h5>
            <h4>课程简介</h4>
            <h5>{{course_detail.course_slogan}}</h5>

            <p v-for="teacher in course_detail.teachers">
                <span>
                    <h4>老师姓名:</h4><img :src="teacher.image" class="teaimage">{{teacher.name}}
                    <h4>老师简介:</h4>{{teacher.brief}}
                </span>
            </p>
            <h4>推荐课程</h4>
            <p v-for="course in course_detail.recommend_courses">
                <span>
                    <router-link :to="{'name':'courseDetail','params':{'id':course.id}}">{{course.name}}</router-link>
                </span>
            </p>
        </div>
    </div>
</template>

<script>
    export default {
        data: function () {
            return {
                course_id: this.$route.params.id,
                course_detail: {},
            }

        },
        methods: {
            init: function () {
                let _this = this
                this.$http.request({
                    url: _this.$url + 'course/' + _this.course_id,
                    method: 'get'
                }).then(function (response) {
                    _this.course_detail = response.data.data
                }).catch(function (response) {
                    console.log(response)
                })

            },

        },
        mounted: function () {
            this.init()

        },
        watch: {
            //监听路由的变化
            '$route': function (to, from) {
                console.log('---->to', to)
                console.log('---->from', from)
                //从前一个页面获取详情课程的id,并保存
                this.course_id = to.params.id
                //用当前的课程id去后台加载数据回来
                this.init()
            },
        }
    }
</script>

<style>
    .teaimage{
         width:50px;
    }
</style>

2-2 后端代码

'''
MySerializers - CourseDetailSerializer
'''
from rest_framework import serializers
from LearnOnline import models

class CourseDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.CourseDetail
        fields = '__all__'

    # 将课程的名字放入返回的数据,从课程表内获取数据
    course_name = serializers.CharField(source='course.name')
    # 获取推荐课程
    recommend_courses = serializers.SerializerMethodField()

    def get_recommend_courses(self, obj):
        # obj.recommend_courses.all()拿到的是该课程所有的推荐课程,queryset对象,放了一个个的课程对象
        # obj值得是当前调用的表,即CourseDetail表,等同于 CourseDetail.recommend_courses.all()
        return [{'id': course.pk, 'name': course.name,} for course in obj.recommend_courses.all()]

    # 获取该课程的教师表信息
    teachers = serializers.SerializerMethodField()

    def get_teachers(self, obj):
        return [{'id': teacher.pk, 'name': teacher.name, 'brief': teacher.brief,'image':teacher.image} for teacher in obj.teachers.all()]

'''
路由
'''
url(r'^course/$', Course.Course.as_view({'get':'get_list'})),
url(r'^course/(?P<pk>\d+)', Course.Course.as_view({'get': 'get_detail'})),

'''
视图函数
'''
from rest_framework.views import APIView
from rest_framework.response import Response
from LearnOnline import models
from LearnOnline import MySerializers
from LearnOnline.utils.commonUtils import MyResponse
from LearnOnline.MySerializers import CourseSerializer, CourseDetailSerializer
from rest_framework.viewsets import ViewSetMixin
from django.core.exceptions import ObjectDoesNotExist
from django.conf import settings

class Course(ViewSetMixin, APIView):

    def get_list(self, request, *args, **kwargs):
        # 实例化MyResponse,即生成结束字典
        response = MyResponse()
        course_list = models.Course.objects.all()
        course_ser = MySerializers.CourseSerializer(instance=course_list, many=True)
        response.msg = '查询成功'
        response.data = course_ser.data

        return Response(response.get_dic)

    def get_detail(self, request, pk, *args, **kwargs):
        '''
        接受传输的课程id 查询对应的信息
        '''
        response = MyResponse()
        print(pk)
        try:
            # 因为查的是课程详情表,传过来的pk 是课程表的主键,正向查询
            course_detail = models.CourseDetail.objects.get(course_id=pk)
            course_detail_ser = CourseDetailSerializer(instance=course_detail, many=False)
            response.data = course_detail_ser.data
        except ObjectDoesNotExist as e:
            response.status = 101
            response.msg = '您要查询的课程不存在'
        except Exception as e:
            response.status = 105
            if settings.DEBUG:
                response.msg = str(e)
            else:
                response.msg = '未知错误'

        return Response(response.get_dic)



 2-3 前端展示

三、路由跳转参数显示设置

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/85247970
今日推荐