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 教程之协同开发
前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的 ...
随机推荐
- nodejs cheerio模块提取html页面内容
nodejs cheerio模块提取html页面内容 1. nodejs cheerio模块提取html页面内容 1.1. 找到目标元素 1.2. 美化文本输出 1.3. 提取答案文本 1.4. 最终 ...
- linux/unix shell bash script 小记
#script PSAATL11*` do $i | awk -F ':' '{print $1}'` do ((k=j+)); m=$(zcat $i | sed -n ${j},${k}p); e ...
- LeetCode OJ:Binary Tree Maximum Path Sum(二叉树最大路径和)
Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...
- gethostbyname()函数
gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件 #include <netdb.h> #include <sys/socket.h> ...
- [置顶]
Git 配置SSH简单玩法?
> 第一步下载git点击直接下载 他会检测您的系统当前是64bit还是32bit安装过程不再啰嗦反正就是Next Next Next Finish 第二步这里你可以下载TortoiseGit点击 ...
- React Native探索(五)使用fetch进行网络请求
相关文章 React Native探索系列 前言 React Native可以使用多种方式来请求网络,比如fetch.XMLHttpRequest以及基于它们封装的框架,fetch可以说是替代XMLH ...
- Matisse,来自知乎的PhotoPicker
简介 Matisse,是一款由知乎开源的媒体选择器. 在Activity和Fragment中使用 支持JPEG,PNG,GIF的图片选择和MPEG,MP4格式的视频选择.不能同时选择图片和视频 两种主 ...
- 卷积神经网络实战-----0001(移植卷积神经网络c++ to python or java)
1. https://github.com/174high/simple_cnn 自己fork的 2. https://github.com/can1357/simple_cnn 最初始的 3. ...
- Scrapy框架及组件描述
Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...
- LG2120 [ZJOI2007]仓库建设
题意 L公司有N个工厂,由高到底分布在一座山上. 工厂1在山顶,工厂N在山脚. 由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用. 突然有一天,L公司的总裁L先生接到 ...