路漫漫其修远兮
吾将上下而求索

python学习:在线教育平台

课程:Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台

地址:https://coding.imooc.com/class/chapter/78.html

代码:https://git.andblog.cn/root/py-mxonline

1-1 项目演示和课程介绍  看完,整体课程功能介绍
2-1 pycharm、navicat和python的安装
    要安装专业版pycharm,
2-2 virtualenv安装和配置
    C:\Program Files (x86)\py2.7  没有加到系统环境变量
    C:\Program Files (x86)\py3.6
    
    pip位置
    C:\Program Files (x86)\py3.6\Scripts
    C:\Program Files (x86)\py3.6   还有python执行文件位置
    
    统一管理虚拟环境
    pip install virtualenvwrapper-win
    mkvirtualenv test1  会自动创建并进入虚拟环境
    mkvirtualenv mxshop --python=xxx   #创建虚拟环境
    退出虚拟环境 deactivate
    查看有哪些虚拟环境 workon
    进入虚拟环境 workon test1 

    包安装完成后,如果找不到命令,退出终端重新进入
    
    创建好的虚拟环境位置:C:\Users\root\Envs
    WORKON_HOME 这个环境变量来决定统一虚拟环境的位置,所有的虚拟环境都放在这里 
    
    workon.bat         #查看有哪些虚拟环境,使用gitshell来操作
    workon mxshop      #进入创建的虚拟环境
    deactivate.bat      #退出虚拟环境
    activate.bat        #激活虚拟环境
    
    C:\Users\root>mkvirtualenv py-teach
     C:\Users\root\Envs is not a directory, creating
    Using base prefix 'c:\\program files (x86)\\py3.6'
    New python executable in C:\Users\root\Envs\py-teach\Scripts\python.exe
    Installing setuptools, pip, wheel...done.


2-3 pycharm和navicat的简单使用
    (py-teach) C:\Users\root>pip install Django==1.11.8
    然后使用pycharm创建django项目,选择项目要放在那里,python命令选择已经存在的,而不是新建虚拟环境,选择上面虚拟环境中的python
    创建好后,就可以运行,在浏览器中就可以看到效果
    
    run - edit 可以自定义配置是否在 0.0.0.0的ip上运行
    
    不同目录的颜色不同,可以设置 mark direct as source root,这样可以将此目录加入到source root,python可以查找到此目录下的源码,不用指定
    上级目录,但是代码里面没有加入,如果代码里面要加,要sys.path.insert...
    
    
3-1 django目录介绍
    创建app,python manage.py startapp message  创建一个新app
    
    当apps目录里面有message app的时候,在其他文件中使用这个app,要用 from apps.message import ...比较麻烦,可以将apps放到source root中,
    使用message的时候,就可以from message import ...方便些
    
    django目录   apps,log,media,py_teach,static,templates,manage.py
    
    
3-2 配置表单页面  
    
    安装MySQL驱动(py_teach) C:\Users\root>pip install mysqlclient==1.3.12
    配置好后就可以执行:
	(py_teach) D:\python测试\py_teach>python manage.py makemigrations
	(py_teach) D:\python测试\py_teach>python manage.py migrate

	template查找位置:'DIRS': [os.path.join(BASE_DIR, 'templates')]
	
	html设置css位置:<link rel="stylesheet" href="/static/css/style.css">
	找不到css,需要再配置:
	STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
	STATIC_URL = '/stat/'
	上面的两句是相对应的,访问url的STATIC_URL路径,会去本地的STATICFILES_DIRS去寻找

	

3-3 django orm介绍与model设计	
	每新建一个app,都要注册app,否则生成数据库的时候会找不到
	将apps路径添加到系统路径,否则查找不到sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
	或者install_apps添加apps.message两种方式都可以
	
	如果代码里面有中文,记得# -*- coding:utf-8 -*-
	
	object_id = models.CharField(max_length=50, default='', primary_key=True, verbose_name='主键')
    name = models.CharField(max_length=20, verbose_name=u'用户名')
    email = models.EmailField(verbose_name=u'邮箱')
    address = models.CharField(max_length=100, verbose_name=u'联系地址')
    message = models.CharField(max_length=500, verbose_name=u'留言信息')
	

3-4 django model的增删改
	UserMessage.objects.filter(name='a', address='b')  a&b
	
	if request.method == 'POST':
	name = request.POST.get('name', '')
	message = request.POST.get('message', '')
	address = request.POST.get('address', '')
	email = request.POST.get('email', '')

	user_message = UserMessage()
	user_message.name = name
	user_message.message = message
	user_message.address = address
	user_message.email = email
	user_message.object_id = '3'
	user_message.save()


3-5 django url templates配置
	模板渲染
	{{ 变量 }}
	{% 函数 %}
	判断语句
	value="{% if not my_message.name == 'andy' %}hello{% else %}{{ my_message.name }}{% endif %}" 

	使用url别名好处,
	url(r'^form/$', getform, name='go_form')
	可以在后面开发中使用value="{% url 'go_form' %}"表明这个路径 /form
	当业务改动,将上面的url更改为
	url(r'^bbs/$', getform, name='go_form'),
	后面的依然不变value="{% url 'go_form' %}"表明这个路径 /bbs


4-1 使用py3.6和django1.11开发系统前注意事项(补充小节)
	无
4-2 用django2.0开始课程的注意事项(补充小节)
	无


4-1 django-app 设计
	user-用户管理
	course-课程管理
	organization-机构和教师
	operation-用户操作
	

4-2 新建项目
	新建项目


4-3 自定义userprofile
	继承django的user表,并增加自己的字段


4-4 user modesl.py设计
	循环引用会出错
	比如user有course, course有user,都会有外键,会出错
	
	operation是更上一层的model,来调用course,organization,users,防止循环引用
	因为emailverifyrecord和pagebanner是单独的model,不会和其他产生关系,放到user下面
	
	send_time = models.DateTimeField(default=datetime.now)这里now不能有阔浩,会根据类实例化的时间来定


4-5 course models.py设计
    由下面几张表组成
	Course - 课程基本信息
	Lesson - 章节信息
	Video - 视频
	CourseResource - 课程资源
	
	
4-6 organization modesl.py设计
	由下面几张表组成
	CourseOrg - 课程机构基本信息
	Teacher - 教师基本信息
	CityDict - 城市信息


4-7 operation models.py设计
	由下面几张表组成
	UserAsk - 用户咨询
	UserMessage - 用户消息
	CourseComments - 用户评论
	UserCourse - 用户学习课程
	UserFavorite - 用户收藏
	
4-8 数据表生成以及apps目录建立
	setting中注册app,生成数据表



5-1 django admin介绍
	创建超级用户
	(py_teach) D:\python测试\py_teach>python manage.py createsuperuser
	Username: admin
	Email address: a@a.com
	Password:admin123

	可以更改web为中文,在setting更改
	LANGUAGE_CODE = 'zh-hans'
	更改时区
	TIME_ZONE = 'Asia/Shanghai'
	使用本地时间
	USE_TZ = False


5-2 xadmin的安装
	pycharm设置字符集为utf-8
	setting - editor - file encoding 能设置的都设置成 utf-8

	python3安装xadmin字符集错误,下载zip包,将README.rst文件清空,重新装
	https://github.com/sshwsfc/xadmin
	https://github.com/sshwsfc/xadmin/archive/master.zip

	(py_teach) D:\python测试\py_teach>pip install C:\Users\root\Desktop\xadmin-master.zip

	注册app
	'xadmin',
    'crispy_forms',

	url中也修改
	from django.conf.urls import url
	from django.contrib import admin
	import xadmin

	urlpatterns = [
    url(r'^xadmin/', xadmin.site.urls),
	
	新建xadmin表
	(py_teach) D:\python测试\py_teach>python manage.py makemigrations
	(py_teach) D:\python测试\py_teach>python manage.py migrate

	启动服务就可以
	
	
	后面将xadmin作为源码包放到了extra_apps目录中了,在github中安装是可以体验一些新特性
	
	
5-3 users app 的model注册

	setting - editor - file and code templates 可以设置自己的模板,有很多自带的变量,可以百度,比如日期这些

	# -*- coding:utf-8 -*-
	__author__ = 'andy'

	verbose_name 在后台中会体现出来,有写的就是自定义的名字
	
	xadmin作用就是增删改查数据库比较方便。


5-4 剩余app model注册

	注意,python文件名必须是adminx.py,不能是其他名字


5-5 xadmin全局配置
	具体查看代码
	class BaseSetting(object):
    # 开启主题功能
    enable_themes = True
    use_bootswatch = True


	# x admin 全局配置参数信息设置
	class GlobalSettings(object):
		site_title = "理站"
		site_footer = "mooc"
		# 收起菜单
		# menu_style = "accordion"

	apps.py文件里面设置的是app的名字,具体显示是后台中左边显示的模块的名字
	还要和__init__.py文件配合使用


6-1 首页和登录页面的配置
	拷贝静态文件到static目录
	


6-2 用户登录-1
6-3 用户登录-2

{% if request.user.is_authenticated %}
和view里面是互相配合的,使用django自带的登录功能
def user_login(requests):
    if requests.method == 'POST':
        user_name = requests.POST.get('username', '')
        pass_word = requests.POST.get('password', '')
        user = authenticate(username=user_name, password=pass_word)
        if user is not None:
            login(requests, user)
            return render(requests, 'index.html')
        else:
            return render(requests, 'login.html')
    elif requests.method == 'GET':
        return render(requests, 'login.html', {})


也可以自己实现auth方法来自定义逻辑判断,比如可以同时通过用户名和邮箱来登录
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
如果能查到此用户或者查询到邮箱,都返回查到的用户对象




6-4 用form实现登录-1

6-5 用form实现登录-2
	基于类的方式实现登录
	form的作用是在接收到请求后先做预处理,判断。然后进入自定义配置
	


6-6 session和cookie自动登录机制
	django.session表存放用户的登录信息。每个登录成功的用户都有一个session id
	session id保存在cookie中,作为此用户的凭证。


6-7 用户注册-1
	html中可以使用{% url 'login' %} 函数来表示实际的路径
	也可以使用
	{% load staticfiles %}
	{% static 'css/reset.css' %} 来表示 /static/css/reset.css 目录
	
	第三方插件验证码
	https://github.com/mbi/django-simple-captcha
	(py_teach) D:\python测试\py_teach>pip install django-simple-captcha==0.4.6
	
	https://django-simple-captcha.readthedocs.io/en/latest/usage.html#installation
	根据上面的教程来安装
	会生成一个mysql表

	
6-8 用户注册-2
	验证码后续的一些处理

	
6-9 用户注册-3
	发送邮件函数编写
	测试可成功发送
	

6-10 用户注册-4
	注册逻辑和html编写
	如果注册邮箱被使用,返回‘用户已注册


6-11 找回密码(1)
	 {{ forget_from.captcha }}{{ active_form.captcha }}
	 是分别两个函数里面返回的自己的验证码对象,其实可以合并成一个
	

6-12 找回密码(2)
	后续逻辑处理



7-1 django templates模板继承1
7-2 django templates模板继承2
	模板可以使用include,将公用的部分包含进来,比如页头和页尾,但是这样包含进来的部分就不能自定义修改了,比如判断已经登录或者没有登录。
	可以使用模板的继承来解决这个问题,将动态的部分设置为block,子类里面只要重写这部分就行,其他没有重写的部分继承父类的模板内容
下面是base页面
<!DOCTYPE html>
<html>
{% load staticfiles %}
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >
<title>{% block title %}课程机构列表 - 慕学在线网{% endblock %}</title>
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/animate.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
{% block custom_css %}{% endblock %}
...

org页面继承上面的页面,假如想更改title,只要重写下面的block就行,如果没有的话,继承父类的内容
{% extends 'base.html' %}
{% load staticfiles %}
{% block title %}课程机构列表 - 慕学在网{% endblock %}

{% block custom_bread %}
    <section>
        <div class="wp">
            <ul  class="crumbs">
                <li><a href="index.html">首页</a>></li>
                <li>课程机构</li>
            </ul>
        </div>
    </section>
{% endblock %}



	
7-3 课程机构列表页数据展示1	
	
	上传图片,要设置图片配置, 和static差不多
	MEDIA_URL = '/media/'
	MEDIA_ROOT = os.path.join(BASE_DIR, 'media')


7-4 课程机构列表页数据展示2	
	需要在setting中template配置里面添加:'django.core.context_processors.media',
	将配置中的media_url注册到html中,html中可以使用{{ MEDIA_URL }},可以调试查看元素

	from django.views.static import serve
	from py_teach.settings import MEDIA_ROOT
	配置处理media的函数
	url(r'^media/(?P<path>.*)$', serve, {'document_root':MEDIA_ROOT})
	
	图片的具体路径:data-url="{{ MEDIA_URL }}{{ course_org.image }}"  等同于:http://localhost:8000/media/org/xx/xx/a.jpg
	
7-5 列表分页功能
	pip install django-pure-pagination

	说明文档:https://github.com/jamespacileo/django-pure-pagination

	setting中添加app:
	添加这个模块后,html中需要修改,修改遍历的对象为下面,不然出错
	{% for course_org in all_orgs.object_list %}


7-6 列表筛选功能
	{% ifequal city.id|stringformat:'i' city_id %}active2{% endifequal %}  将数字转为字符
	{{ forloop.counter }}  template里面可以直接使用这个变量,for循环中第几个

	template里面的city_id和city.id两个作用不同里面要分开city.id是从数据库中读取出来,city_id是从用户那里得到的
	

7-7 modelform提交我要学习咨询1
7-8 modelform提交我要学习咨询2
	命名空间:url(r'^org/', include('organization.urls', namespace='org'))
		然后template里面就可以使用{% url 'org:org_list' %}来指定这个命名空间里面的org_list,以防止重名。
	

7-9 机构详情展示-1
	添加外键
    Course表里有外键 course_org = models.ForeignKey(CourseOrg) 连接到 CourseOrg ,则可以通过
		all_courses = course_org.course_set.all()[:4]来反向查找某个课程机构id 对应的所有课程


7-10 机构详情展示-2
	{% url 'org_home' course_org.id %}  对应于 url(r'^home/(?P<org_id>\d+)/$', OrgHomeView.as_view(), name='org_home'),  
	只需要在后面加一个空格,跟上路径就行


7-11 机构详情展示-3
	{% csrf_token %} 会生成一段html代码


7-12 课程机构收藏功能
	{{ csrf_token }} 会取出csrf的值,而不是代码,用在jquery中	
	收藏前都要判断是否已经登录,如果没有登录,要跳转到登录页面
	
	
	
	
8-1 课程列表
	{{ hot_course.degree }}  在html中只会显示cj,zj,gj,而不是对应的中文名字
	{{ hot_course.get_degree_display }}  django专门用的,会显示出对应的中文名字



8-2 课程详情页1
8-3 课程详情页2
	根据课程来找课程机构对应的图片,可以直接找到对应的外键的信息
	{{ course.course_org.image }}
	
	teacher有个外键指向课程机构,则课程机构可查找到对应有多少老师
	在课程机构model中
	class CourseOrg(models.Model):
		def get_teacher_nums(self):
			return self.teacher_set.all().count()


8-4 课程章节信息1
8-5 课程章节信息2
8-6 课程评论评论功能
8-7 相关课程推荐
8-8 视频播放页面


10-1 配置全局导航
	存在一个问题,课程有很多详情页,但是上面有一个课程大标题,怎么让点到每一个详情页都会选中最上面那个大标题,则每个详情页
	的view里面都要向模板的上一级传递此页面被选中的标识,很麻烦
	下面使用这种方式,假如url为:http://localhost:8000/courses/list/xxx,如果路径是以 '/course' 开头的,都将此标签标为选中状态
	<li {% if request.path|slice:'7' == '/course' %}class='active'{% endif %}>


10-2 全局搜索功能开发
	all_courses = all_courses.filter(Q(name__icontains='')|Q(detail__icontains='')) 不区分大小写进行模糊匹配搜索,同时搜索好几
	个字段, 就是sql中的 where xx like '%xx%'


10-3 个人信息展示
10-4 修改密码和修改头像1
	需要登录才能访问:class UserinfoView(LoginRequiredMixin, View)

 
10-5 修改密码和修改头像2
10-6 修改邮箱和用户信息1
10-7 修改邮箱和用户信息2


10-8 我的课程
10-9 我的收藏功能1
10-10 我的收藏功能2
10-11 我的消息

参考:https://www.jianshu.com/nb/21010157

未经允许不得转载:江哥架构师笔记 » python学习:在线教育平台

分享到:更多 ()

评论 抢沙发

评论前必须登录!