一、在做常见问题的时候遇到的问题

在后端处理数据的时候是通过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协同开发在做常见问题时候遇到的问题的更多相关文章

  1. Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码

    前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...

  2. 协同开发中SVN的使用建议

    协同开发中SVN的使用建议 1.  注意个人账户密码安全 各员工需牢记各自的账户和密码,不得向他人透漏,严禁使用他人账户进行SVN各项操作(主要考虑每个SVN账号的使用者的权限范围问题).如有忘记,请 ...

  3. 【Unity3D游戏开发】NGUI之多分辨率下完美分布式协同开发 (五)

    NGUI多分辨率下完美分布式协同开发:不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 NGUI多分辨率下完美分布式协同开发不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 开发问题 原因分析 ...

  4. 2014-07-25 改进自定义菜单与使用SVN进行协同开发

    今天是在吾索实习的第13天.今天没有做过多的代码设计,只进行了一些代码的分析与进一步优化.其中,发现创建自定义菜单的关键代码书写可分为两部分: JSON格式的字符串在.net中的语法书写: strin ...

  5. HelloX项目github协同开发指南

    概述 为了提高协同开发效率,HelloX项目已托管到github网站上.根据目前的开发进展,创建了下列几个子项目: HelloX操作系统内核项目:https://github.com/hellox-p ...

  6. 【转】协同开发中SVN使用规范试用

    转自:http://www.cnblogs.com/BraveCheng/archive/2012/07/02/2573617.html 协同开发中SVN使用规范试用 目标,要求 本次svn提交规范主 ...

  7. git 入门教程之协同开发

    前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的 ...

  8. 使用git和github进行协同开发流程

    (本文假设各位已经对基本git的基本概念.操作有一定的理解,如无相关git知识,可以参考Pro Git这本书进行相关的学习和练习) 很多项目开发都会采用git这一优秀的分布式版本管理工具进行项目版本管 ...

  9. 【转】Git 教程之协同开发

    前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的 ...

随机推荐

  1. Elasticsearch压缩索引——lucene倒排索引本质是列存储+使用嵌套文档可以大幅度提高压缩率

    注意:由于是重复数据,词法不具有通用性!文章价值不大! 摘自:https://segmentfault.com/a/1190000002695169 Doc Values 会压缩存储重复的内容. 给定 ...

  2. 【2018年全国多校算法寒假训练营练习比赛(第五场)-E】情人节的电灯泡(二维树状数组单点更新+区间查询)

    试题链接:https://www.nowcoder.com/acm/contest/77/E 题目描述 情人节到了,小芳和小明手牵手,打算过一个完美的情人节,但是小刚偏偏也来了,当了一个明晃晃的电灯泡 ...

  3. Maven项目中java类报错-Cannot resolve symbol

    电脑蓝屏了,强制重启之后再打开IDEA里面的项目,所有Java类文件都在报Cannot resolve symbo错误,可以确定所有依赖的包都有引用且jar包没有冲突. 经查询找到这个解决方法: 在I ...

  4. 条款25:考虑写出一个不抛出异常的swap函数

    首先说下标准库的swap算法: namespace std{ template<typename T> void swap(T & a, T & b) { T tmp = ...

  5. vim技巧记录

    安装插件 有个很好的同志已经做了一个比较全的插件集,下载就可以用: mv ~/.vimrc ~/.vimrcbak mv ~/.vim ~/.vimbak git clone https://gith ...

  6. build.prop文件介绍与用法举例

    build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变 以下是修改教程及一些build.prop参数的中英文对照解释,修改前,注意先备份原build. ...

  7. BaseCommand

    import java.io.Serializable; import android.util.Log; public class BaseCommand implements Serializab ...

  8. HihoCoder 1067 最近公共祖先(ST离线算法)

    最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个 ...

  9. Android开发的基础知识点

    1.Android开发的四大组件: Activity:android应用程序上看到的一页. Service:运行在后台,可以其他组件交互(音乐播放器). BroadcoastReceiver:用来对外 ...

  10. ul li 水平居中

    li的float:left方法显然有一个问题,就是无法居中(水平),只能使用padding-left或margin-right的方法方法来固定其居中.但这样可能在宽屏与窄屏的显示不一致.使用这种方法主 ...