课程: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
–
–
–
评论前必须登录!
注册