django项目--慕课在线学习平台
使用的插件 ++django-simple-captcha==0.4.6 ++django-pure-pagination-0.3.0
配置网易邮箱(163)如下: # 一开始配置的QQ邮箱竟然被禁了,还是网易邮箱好哇 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = "smtp.163.com" EMAIL_PORT = 25 EMAIL_HOST_USER = "邮箱" EMAIL_HOST_PASSWORD = "客户端授权码" EMAIL_USE_TLS = False EMAIL_FROM = "邮箱"
++++此处email_password为客户端授权码,网易邮箱比较特殊,此处配置时应该用客户端授权码代替登录密码进行配置
mysql安装信息:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangodemo',
'USER': '用户名',
'PASSWORD': '密码',
'HSOT': '127.0.0.1',
}
}
mkvirtualenv virtualenvironment_name(建立虚拟环境)-->
大量内置应用 ++后台管理系统admin ++用户认证系统auth ++回话系统sessions 安全性 ++表单验证 ++SQL注入 ++跨站点攻击
设置databases,templates下的dirs,新建的staticfiles_dirs
migration生成数据表-->编写views.py(后台的业务逻辑:编写负责相应url请求的函数/功能模块)-->配置urls.py(将用户的请求url映射到某一个函数/模块)-->{1、HTML与css文件分离 2、css文件分离与地址修改}
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static')
]设置静态文件的默认目录
ORM (Object Relation Mapping对象关系映射)
models.py和数据库相关,定义数据库中的表 django1.8后migrations 数据移植、数据迁移(新出现的)也是和数据库相关的
使用了ORM模型,
models:django提供了大量的field类型,这些类型不仅对应着数据库中的类型,也对应着很多更加高级的类型
models.ForeignKey
models.DateTimeField
models.IntegerField
models.IPAddressField
models.FileField
models.ImageField
admin.py给admin应用做配置使用 test.py用于测试(用于放置测试脚本) 项目目录文件 ++manage.py管理项目,例如runserver启动服务器
++settins.py整个网站的配置情况 settings中的templates用于配置处理模板文件的类
settings中ALLOWED_HOSTS表示允许访问本程序的用户,若设置为'localhost',则只允许外界用localhost访问本网站
ROOT_URLCONF指向url配置文件
url
urls.py映射配置文件:决定一个url访问被哪个程序(函数)相应 urlpatterns即映射表
为了避免在同一个url配置文件中存在url冲突,可以用include包含其他url配置文件,但是其他url配置文件中的url被“拉长”了。例如:
在根目录的url文件中进行配置: url(r'^index/',include('blog.urls')),
在blog目录中的url文件中进行配置: url(r'^index/',views.index),
那么实际访问index的url应该是******index/index/
通常将blog中的url配置成空字符串,即用正则表达式“r'^$'”约束为空字符串
****注意配置url的时候一定注意在url的末尾加上'/'这样配置,用户访问该url时,末尾无论加不加'/'都可以成功访问。
templates
HTML文件,使用了Django模板语言(DTL)
DTL初步
render()函数中支持一个dict类型的参数
该字典是后台传递到模板的参数,键为参数名
在模板中使用{{参数名}}来直接使用
django会按照INSTALLED_APPS中的添加顺序查找Templates,因此不同app下templates目录中同名.html文件会造成冲突
解决办法:在各app的templates目录下建立一个与该app同名的文件夹,然后将各自具有冲突的页面放进去即可
init.py声明模块的文件
++wsgi.py :python应用程序和web服务器之间的接口
migrate makemigrations和同步数据库有关
将新添加的应用
子目录project-name中是一些关于项目的配置文件:
++总的urls配置文件 urls.py 以及部署服务器时用到的 wsgi.py 文件
++init.py 是python包的目录结构必须的,与调用有关。
django-admin startproject project-name
django-admin startapp app-name
django-admin start
mysql配置:
user:MrRobot
password:Mr.Robot
dbadmin
workon查看当前有哪些虚拟环境
workon 虚拟环境名 :即进入想要进入的虚拟环境
使用url别名(避免后期改动url的时候改动大量语句)
html中:
<form action="{% url 'go_form' %}" method="post" class="smart-green">
url.py中:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^form_go/$', getform,name='go_form'),
]
解决model循环引用的问题:分层设计
为方便管理一个大平台下的各app,我们通常将所有app统一存放在项目根目录的apps(Programmer所建)下,此时必须在在项目settings的文件中,进行如下配置:
import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
即将apps目录作为第一搜索目录(下标为0)
PEP8 (Python编码规范)
赋值"="两遍加空格
给出多参数时,逗号后面空格再写下一项
class Course(models.Model):
# Course即数据库表名,django中均继承自models.Model
name = models.CharField(max_length=50, verbose_name=u"课程名")
# CharField指该列为char类型,verbose_name指该列对应名称,前缀u指进行unicode编码
detail = models.TextField(verbose_name=u"课程详情")
# detail为文本域
learn_times = models.IntegerField(default=0, verbose_name=u"学习时长(分钟)")
image = models.ImageField(upload_to="courses/%Y/%m",verbose_name=u"封面图片", max_length=100)
# upload_to指该图片的url地址
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间")
# default=datetime.now指默认为当前时间
class Meta:
# Meta前面空一行
verbose_name = u"课程"
# verbose_name即对该model的名字进行设置
verbose_name_plural = verbose_name
# verbose_name_plural是对model的复述,如果注释以上语句,则系统进行解析时会自动在verbose_name后加上's'
重载model中class的unicode(def)方法可以自定义该model的"缩写"显示格式
踩过的坑
一、
继承自AbstractUser的UserProfile类,在用admin添加用户时出现错误:1452, 'Cannot add or update a child row: a foreign key constraint fails是因为在第一次做数据库修改时,必须在做任何数据迁移之前做makemigrations命令。
解决办法:删库-->重新创建superuser-->makemigrations-->migrate即可
二、 模板引擎
for循环中有存在内置的循环记数变量{{ forloop.counter }}可调出(从1开始)