render返回的是 模板 HttpResponse返回的是 响应
视图里的函数 参数第一个为request 后续的相当于 /a/b/c 的形式 对应于url里的url(r'/(\d+)/(\d+)')里的这些子组
即是说输入的网址 .../3/4 3和4作为参数传入视图里对应的函数后 作为request 后续的参数
request.GET 为获取网址的输入参数 ?key=val 以字典的形式
reverse函数 接受urls.py 里的url里的name作为第一个参数 加上对应name的视图函数所需要的参数 会返回一个地址 u'/add/3/4/'
故在我们需要更改网址的时候 不用大动干戈去把template里的模板等也更改
如果我们要把/add/3/4 改为/new_add/3/4
只需在templates里的模板中用到该网址的地方
<a href="/add/3/4"></a> 改为
<a href = "{% url '需要的name' 参数 %}"></a> 注意这里的url
这样功能(视图)不变 对应的网址url已经改变
在settings.py里添加app的name才能有路径可以找到对应app的templates的文件夹
render的使用
一个template对象可以使用render函数和context类来进行渲染 context对象一般为字典形式
使用render的时候,Django 会自动找到 INSTALLED_APPS 中列出的各个 app 下的 templates 中的文件
在视图里 render(request,模板(*.html),context对象(字典))因为在这里是用于返回 没有template对象所以第一个参数要用request
模板文件.html 里 {% for ... %}{% endfor %} if这些也是一样的{{ 变量名 }}
变量的用{{}} 有功能的用{% %}{% end %} {{}}表示可替换的
这里的也是 if elif
模板文件.html 里的{% for %}里有forloop.last 等变量
forloop.counter 索引从 1 开始算
forloop.counter0 索引从 0 开始算
forloop.revcounter 索引从最大长度到 1
forloop.revcounter0 索引从最大长度到 0
forloop.first 当遍历的元素为第一项时为真
forloop.last 当遍历的元素为最后一项时为真
forloop.parentloop 用在嵌套的 for 循环中,获取上一层 for 循环的 forloop
若是我们想要在多个模板都可以共用同一个变量 那就需要上下文渲染器 一个模板中的变量我们直接用 render(request,'*.html',一个字典)
而上下文渲染器 其实就是函数返回字典 用request函数返回字典
在模板里用{{ request.变量}}
上下文渲染器 *.py 他要添加到settings.py 里
其实 就是让它变成这个project 默认的变量
与数据库有关的代码一般都在models.py里
新建的类 继承于models.Model 每个类相当于数据库里的一份表
类名.objects.create 类名.objects.get 分别为创建和查询 创建方法也可以跟类实例的用法一样 但是要加个 实例.save() 保存
获取除了objects.get() 还有 objects.all()返回的是类似列表形式
Author.objects.get_or_create(name="WeizhongTu", email="tuweizhong@163.com")
尝试获取,不存在就创建 返回值(object, True/False)
objects.filter() 用来选择满足要求的
objects.exclude() 则是选择过滤的
Queryset 的意思是查询 queryset api 是指一些可用于查询的内置函数之类
Fields 的学习
foreignkey 外键 多个表中 a表设置某字段为主键,则b表可设计同样的字段作为外键 与a表关联
ForeignKey,ManyToManyField与OneToOneField分别在Model中定义多对一,多对多,一对一关系。
例如,一本书由一家出版社出版,一家出版社可以出版很多书。一本书由多个作者合写,一个作者可以写很多书。
pub=models.ForeignKey(Publisher) authors=models.ManyToManyField(Author)
记得models.py修改完后
要用 python manage.py makemigrations 和 python manage.py migrate
可以用add添加键
random.randrange ([start,] stop [,step]) 返回其中的一个随机数
str.split(str1,num) str1为分隔符,num为分割次数
range(a,b) 不包括b 因为经常会不记得
print str(Author.objects.all().query)
打印执行的sql语句
Author.objects.values_list('a','b') 选择作者的a和b
只需要 1 个字段,可以指定 flat=True
Author.objects.values_list('name', flat=True) 不加的话默认两个 即后面有逗号
values_list元祖形式
values 字典形式
order_by 用于排序 ex:*.objects.all().order_by()
python 3.X 的字符串的表示方法可以通过 from __future__ import unicode_literals 来导入 '' 的字符串都为unicode b''才为str
@的用法
def f1():
pass
@f1
def f2():
pass
@f1 等价于 f2 = f1(f2()) 然后直接覆盖掉后续对f2的定义
annotate(count=Count('str')) 中的Count需要 from django.db.models import Count
计算哪个的数目就用哪个模型
比如计算文章数那就选择Article.objects.all().values('author_id')....
由于是计算作者的文章数 故values里就用作者id
查询是可以跨表查询的 不过字符串又要求
比如在Article 里查找作者名称 因为Article里只有author author_id 没有跟名字有关的
所以在查询名字的时候会到author的表里查找 查找时要写为'author__name' 双下划线
查询中 用select_related(‘另一张表’) 即可一次性查询两张表 这样在后续的操作中就不需要重复访问数据库
注意select_related(‘’)只可用于多对一的其中一方 即一篇文章就一个作者 反之如果用作者关联文章则不行
要用多对一 多对多 要用prefetch_related()
用prefetch_related和不用的区别
defer和only的使用
注意 defer only和filter exclude之间的区别
defer only 筛选的是键 filter和exclude筛选的是值
注意:sql查询必须包含主键
后台部分 (修改admin.py)
写完models.py后 修改 admin.py
这样在 admin后台里会有Article这个表
在models.py里修改类的 def __unicode__(self):return self.title 可以让后台更人性化
添加类 class ArticleAdmin(admin.ModelAdmin) 用以显示其他需要显示的Field (因为上面的结果只显示文章title这一个Field)list_display用来配置需要显示的field
记住后面需要注册 admin.site.register(Article,ArticleAdmin)
注意:后台功能还很多 需要重新在深入学习
表单学习
views.py中的修改 添加了两个视图 首页index和add add是通过get的方法获取a和b 再响应 对应输入的网址应该是add/?a=b=
urls.py的修改
index.html的内容 用的是get方法 提交到的网址是/add/ 因为是get 所以会把参数加到网址后面 这里的input里的name 即是视图函数里reques.GET获取的key