K12协同开发在做常见问题时候遇到的问题
一、在做常见问题的时候遇到的问题
在后端处理数据的时候是通过serialize来实现的,从数据库中查出自己想要的数据,直接返回数据。
在前端发送ajax请求获取数据并且在页面上以好看的形式渲染。
1、相关的表
class Course(models.Model):
"""课程"""
name = models.CharField(max_length=128, unique=True)
course_img = models.CharField(max_length=255)
sub_category = models.ForeignKey("CourseSubCategory") course_type_choices = ((0, '付费'), (1, 'VIP专享'), (2, '学位课程'))
course_type = models.SmallIntegerField(choices=course_type_choices)
degree_course = models.ForeignKey("DegreeCourse", blank=True, null=True, help_text="若是学位课程,此处关联学位表") brief = models.TextField(verbose_name="课程概述", max_length=2048)
level_choices = ((0, '初级'), (1, '中级'), (2, '高级'))
level = models.SmallIntegerField(choices=level_choices, default=1)
pub_date = models.DateField(verbose_name="发布日期", blank=True, null=True)
period = models.PositiveIntegerField(verbose_name="建议学习周期(days)", default=7)
order = models.IntegerField("课程顺序", help_text="从上一个课程数字往后排")
attachment_path = models.CharField(max_length=128, verbose_name="课件路径", blank=True, null=True)
status_choices = ((0, '上线'), (1, '下线'), (2, '预上线'))
status = models.SmallIntegerField(choices=status_choices, default=0)
template_id = models.SmallIntegerField("前端模板id", default=1) coupon = GenericRelation("Coupon") # 用于GenericForeignKey反向查询,不会生成表字段,切勿删除
price_policy = GenericRelation("PricePolicy") def __str__(self):
return "%s(%s)" % (self.name, self.get_course_type_display()) def save(self, *args, **kwargs):
if self.course_type == 2:
if not self.degree_course:
raise ValueError("学位课程必须关联对应的学位表")
super(Course, self).save(*args, **kwargs) class OftenAskedQuestion(models.Model):
"""常见问题"""
content_type = models.ForeignKey(ContentType,
limit_choices_to={'model__contains': 'course'}) # 关联course or degree_course
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id') question = models.CharField(max_length=255)
answer = models.TextField(max_length=1024) def __str__(self):
return "%s-%s" % (self.content_object, self.question) class Meta:
unique_together = ('content_type', 'object_id', 'question')
serializer
class CourseQuestionSerializer(ModelSerializer):
class Meta:
model = models.OftenAskedQuestion
fields = ['question','answer']
depth = 2
由上面的表发现是课程和问题是通过content_type 关联的。所以我们在通过课程去查询问题的时候。要利用contenttype去查找
2、后端开发
from django.contrib.contenttypes.models import ContentType
print(course_obj._meta.model_name,'表名') #查看当前的表名 course_obj = model.Course.objects.filter(pk=kwargs.get('pk')).first() #首先找到课程的id
ct_id = ContentType.objects.filter(app_label='api', model=course_obj._meta.model_name).first().id #找到表类型的id
o_list = models.OftenAskedQuestion.objects.filter(content_type_id=ct_id, object_id=course_obj.id) #然后通过课程的id去找课程相关联的问题
ser = my_seri.CourseQuestionSerializer(instance=o_list, many=True) #吧查到的所有问题进行序列化 print(ser.data) res["data"] = ser.data
return JsonResponse(res) #返回数据
3、前端开发
通过vue框架发送ajax请求
<ul class="tab">
<li @click="coursebrief()">课程概述</li>
<li @click="coursechapters()">课程章节</li>
<li @click="coursequestion">常见问题</li>
</ul>
coursequestion(){
var that = this;
this.$axios.request({
url:'http://127.0.0.1:8000/api/course/'+ this.pk+'.json'+'?data_type=question',
method:'GET',
responseType:'json'
}).then(function (response) {
console.log(response.data);
that.question_list = response.data.data; #保存后端发过来的数据
console.log(that.question_list)
})
}
}
一开始设置默认
data () {
return {
question_list:[],
}
},
<div>
<h1>常见问题</h1>
<ul v-for="item in question_list">
<li>问:{{ item.question }}</li>
<li>答:{{ item.answer }}</li>
</ul>
</div>
二、vue在前端实现tab切换
代码实现
<ul class="tab">
<!--<li v-for="(item, index) in tabs" :class="{active:index == num}" @click="tab(index)">{{item}}</li>--> <li @click="tab('detail')">课程概述</li>
<li @click="tab('chapters')">课程章节</li>
<li @click="tab('question')">常见问题</li>
</ul>

1 <div class="detail box">
2 <h3>可以根据不同的学习情况购买不一样的学习套餐哦!</h3>
3 <ul>
4 <li v-for="item in box.detail.priceList">{{item.price}}/{{item.valid_period}}</li>
5 </ul>
6 <div>
7 <h3>课程概述</h3>
8 <p>{{box.detail.brief}}</p>
9 </div>
10 <div>
11 <h3>为什么学习这门课程</h3>
12 <p>{{box.detail.why_study}}</p>
13 </div>
14 <div>
15 <h3>我将学到的内容</h3>
16 <ol>
17 <li v-for="item in box.detail.outlineList">{{item.title}}
18 <div>{{item.content}}</div>
19 </li>
20 </ol>
21 </div>
22 <div>
23 <h3>此项目如何有助于我的职业生涯?</h3>
24 <p>{{box.detail.career_improvement}}</p>
25 </div>
26 <div>
27 <h3>课程先修要求</h3>
28 <p>{{box.detail.prerequisite}}</p>
29 </div>
30 <div>
31 <h3>课程讲师简介</h3>
32 <ul>
33 <li v-for="item in box.detail.teacherList">
34 {{item.name}} {{item.title}} {{item.brief}}
35 </li>
36 </ul>
37 </div>
38 </div>
39 <div class="chapters box">
40 <ul>
41 <li v-for="item in box.chapters">
42 第{{item.chapter}}章 | {{item.name}}
43 <ul>
44 <li v-for="section in item.coursesections">
45 {{section.name}}
46 </li>
47 </ul>
48 </li>
49 </ul>
50 </div>
51 <div class="comment box">
52
53 </div>
54 <div class="question box">
55 <h1>常见问题</h1>
56 <ul v-for="item in box.question_list">
57 <li>问:{{ item.question }}</li>
58 <li>答:{{ item.answer }}</li>
59 </ul>
60 </div>
coursedetail.vue
methods:{
tab(cls) { //实现tab切换
$(".box").each(function (index, ele) {
console.log(index,ele,'........');
$(ele).css("display", "none") //循环一开始都设置成none,不显示
});
$("."+cls).css("display", "block") //然后把当前点击的那个设置成显示
},
K12协同开发在做常见问题时候遇到的问题的更多相关文章
- Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码
前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...
- 协同开发中SVN的使用建议
协同开发中SVN的使用建议 1. 注意个人账户密码安全 各员工需牢记各自的账户和密码,不得向他人透漏,严禁使用他人账户进行SVN各项操作(主要考虑每个SVN账号的使用者的权限范围问题).如有忘记,请 ...
- 【Unity3D游戏开发】NGUI之多分辨率下完美分布式协同开发 (五)
NGUI多分辨率下完美分布式协同开发:不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 NGUI多分辨率下完美分布式协同开发不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 开发问题 原因分析 ...
- 2014-07-25 改进自定义菜单与使用SVN进行协同开发
今天是在吾索实习的第13天.今天没有做过多的代码设计,只进行了一些代码的分析与进一步优化.其中,发现创建自定义菜单的关键代码书写可分为两部分: JSON格式的字符串在.net中的语法书写: strin ...
- HelloX项目github协同开发指南
概述 为了提高协同开发效率,HelloX项目已托管到github网站上.根据目前的开发进展,创建了下列几个子项目: HelloX操作系统内核项目:https://github.com/hellox-p ...
- 【转】协同开发中SVN使用规范试用
转自:http://www.cnblogs.com/BraveCheng/archive/2012/07/02/2573617.html 协同开发中SVN使用规范试用 目标,要求 本次svn提交规范主 ...
- git 入门教程之协同开发
前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的 ...
- 使用git和github进行协同开发流程
(本文假设各位已经对基本git的基本概念.操作有一定的理解,如无相关git知识,可以参考Pro Git这本书进行相关的学习和练习) 很多项目开发都会采用git这一优秀的分布式版本管理工具进行项目版本管 ...
- 【转】Git 教程之协同开发
前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的 ...
随机推荐
- 小米手机调试出现DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs
小米手机就是这样子,权限什么的总是做的比较严格,去开发者选项里面找答案,看了下很多都是以前的,在最底下发现了一个选项“启用MIUI优化”,其实一般手机的开发者选项里面是不会有这个选项的.关掉该选项,重 ...
- git一个系列教程
https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA%8E%E7%89%88%E6%9C%AC%E6%8E%A7%E5%8 ...
- MySQL 5.7.3.0 安装 全程截图
前言: 下一个班快讲MySQL数据库了,正好把服务器里面的MySQL卸了重装了一下. 截个图,作为笔记.也正好留给需要的朋友们. 目录: 下载软件 运行安装程序 安装程序欢迎界面 许可协议 查找更新 ...
- ARM的异常处理方式
1.什么是异常? 正常工作之外的流程都叫异常 异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作 中断是异常的一种 2.异常向量表 所有的CPU都有异常向量表,这是CPU设 ...
- jsp转发和重定向
response应答 a) Response.sendRedirect(路径); //重定向 b) Response.getRequestDispatcher(路径).forward(request, ...
- [AOP] 6. 一些自定义的Aspect - 方法的重试(Retry)
前面的一系列文章介绍了AOP的方方面面: AOP的由来以及快速上手 AOP的两种实现-Spring AOP以及AspectJ Spring AOP中提供的种种Aspects - Tracing相关 S ...
- 边缘检测︱基于 HED网络TensorFlow 和 OpenCV 实现图片边缘检测
本文摘录自<手机端运行卷积神经网络的一次实践 – 基于 TensorFlow 和 OpenCV 实现文档检测功能> 只截取感兴趣 的片段. . 一.边缘检测 1.传统边缘检测 Google ...
- 在C++中指针和引用传值区别
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- 【英语】Bingo口语笔记(84) - 惊讶的表达
- jQuery使用prop设置checkbox全选、反选
$(function(){ var checkbox = $("input[type='checkbox']"); //全选 $('#select-all' ...