django补缺
url方法:url后面跟着别名,category 就是url方法
<a href="{% url 'category' category.id %}"</a>
在html中写入可以返回url的路径
{{ request.path }}
row方法
col-lg-8用法

from django.db import models # Create your models here. class Book(models.Model): name = models.CharField(max_length=128) price = models.PositiveSmallIntegerField(null=True) #[0 ,32767]的取值范围 authors = models.ManyToManyField("Author") #多对多,django会默认给你创建第三张表,来放对应类型, 实现双向一对多 publisher = models.ForeignKey("Publisher") #关联Publisher的主键,主键就是自增的那个ID pub_time = models.DateField() #时间为天 def __str__(self): return self.name ''' models.Book.objects.create(name='py',price=66,pub_time="2017-07-11",publisher_id=3) 创建 models.Book.objects.all() 查看所有 b1=models.Book.objects.all()[0] 根据作者去查 b1.authors.all() 创建的过程中是不能加ManytoMany的关系的,必须把这个对象创建完成,在加 例如: b4=models.Book.objects.create(name='New',price=299,pub_time="2017-03-21",publisher_id=2) b4.authors.add(1,2,3) 这里的1,2 分别是作者id,多加几个也行 b4.save() 保存后才会提交 b4.authors.remove(1,2) b4.save() 也是同样道理 b4.authors.all() 查看多对多关系 ###FK 外键查询 b4.publisher.name 就行,因为b4是book表的对象,而且book表做了publisher的外键,所以这样就可以直接查到 ''' ''' ###CRUD ##写多了你会发现, 跨表操作就是用双下划线,不同表之间关联就用ForeKey, 要通过foreKey查询,就用这张表的对象.另外一张表的字段即可 创建 object.create 修改 object.update 查询 object.filter 返回的列表 object.get 返回对象或错误,有就返回,没有就报错 models.Book.objects.get(id=11) models.Book.objects.get_or_create(name='Haddop',publisher_id=2,pub_time="2016-10-10") 如果没有就创建 models.Book.objects.filter(name__contains = 'py') 查询py的名称 models.Book.objects.filter(name__icontains = 'py') 查询的时候忽略大小写 models.Book.objects.filter(name__startswith = 'p') 查询开头是p的 models.Book.objects.filter(name__endswith = 'p') 查询结尾是p的 models.Book.objects.filter(pub_time__range=('2016-01-01','2017-11-11')) 查询这段日期内的书 models.Book.objects.filter(pub_time__year=2015) 查询2015年的 models.Book.objects.filter(pub_time__year__gte=2015) models.Book.objects.filter(pub_time__day=3) 查询3月的 models.Book.objects.filter(pub_time__week_day=3) 查询第三天的 models.Book.objects.values('name','price') 只查看书名和价格 models.Book.objects.exclude(price=None) 反查询 查询price为none的 p1 =models.Publisher.objects.last() p1.book_set.all() 多个图书馆关联同一个出版社,通过出版社反向查询出版了多少书 删除 object.delete ##aggregate聚合 from django.db.models import Avg,Max,Min,Sum,Count from django.db.models import Avg models.Book.objects.all().aggregate(Avg('price')) 算平均价格 models.Book.objects.values('name').count() 统计书的个数 from django.db.models import Sum models.Book.objects.all().aggregate(Sum('price')) 算总数 models.Book.objects.values('publisher__name').annotate(Count('id')) 查看每个出版社,总共出了多少书 models.Book.objects.values('publisher__name').annotate(Avg('price')) 每个出版社出的书。平均多少钱 models.Book.objects.filter(name__contains='H',pub_time__year='2016') and语句 filter匹配2个条件 Q语句 Q方法 组合使用,多方法使用 from django.db.models import Q 这是一个条件 Q(pub_time__year='2017') <Q: (AND: ('pub_time__year', '2017'))> 设置or条件 Q(pub_time__year='2017') | Q(pub_time_year='2016') <Q: (OR: ('pub_time__year', '2017'), ('pub_time_year', '2016'))> >>> q = Q(pub_time__year='2017') | Q(pub_time__year='2016') >>models.Book.objects.filter(q) 设置and条件 q2 = Q(pub_time__year=2017),Q(pub_time__year=2016) >>> q2 (<Q: (AND: ('pub_time__year', 2017))>, <Q: (AND: ('pub_time__year', 2016))>) 这样查询的时候会出错 >>AttributeError: 'Q' object has no attribute 'split' F语句 from django.db.models import F models.Book.objects.update(price=F('price')+10) 给price赋值,然后拿出来在+10 这样所以的price都会加10 models.Book.objects.update(memo=F('name')) 把所有name的值赋给memo 当你新增了表的字段后,你需要python manager.py makemigrations的时候就会提醒你设置一个值 所以你需要 memo =modles.CharField(null=True) 06-18 ''''' class Author(models.Model): name = models.CharField(max_length=32) email = models.EmailField(unique=True) #email字段 def __str__(self): return self.name class Publisher(models.Model): name = models.CharField(max_length=128,unique=True) website = models.URLField(unique=True) #URL 字段 def __str__(self): return self.name #出版社是唯一的,所以把出版社定位外键,,那么在添加book的时候,就需要指定这个外键ID
Django分页功能-django Pagination
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2) #一页分2条
>>> p.count #总共多少条
4
>>> p.num_pages #总共多少页
2
>>> p.page_range
[1, 2]
>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']
>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
1
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def listing(request): contact_list = Contacts.objects.all() paginator = Paginator(contact_list, 25) # 一页分25条 page = request.GET.get('page') try: contacts = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. contacts = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. contacts = paginator.page(paginator.num_pages) #如果超出页数,就取最后一夜 return render_to_response('list.html', {"contacts": contacts})
objects.all()方法---类似于生成器,只有你在用的时候,才会去取!
objects.all() 没有把数据从数据库里取出来
只有你在真正循环的时候,才会去数据库里找
自定义模板
from django.template import Library from django.utils.safestring import mark_safe register = Library() @register.simple_tag def truncate_upload_img(img_src): print(img_src.name,img_src.name.lstrip('/uploads/')) # return img_src.name.lstrip('/uploads/') return img_src.name.split('/')[1] @register.simple_tag def redner_paginator_btn(articles,page): current_page = articles.number #前端写的自定义模板传入了articles的值,这个值是在views中生成的django分页方法,所以这里还可以使用这个articles.number方法 if abs(current_page - page) <= 3: htmle = """<li><a href="?page={page}">{page}</a></li>""".format(page=page) return mark_safe(htmle) #把写的html返回给前端中的自定义模块区域, #对于不小于3的就会返回个none return ''
一个ajax请求
$('#add_submit_ajax').click(function(){
$.ajax({
url: '/ajax_add_app',
// data: {'user': 123,'host_list': [1,2,3,4]},
data: $('#add_form').serialize(), #form表单中的值,无需再自己写data数据
type: "POST",
dataType: 'JSON', // 内部
traditional: true,
success: function(obj){
console.log(obj);
},
error: function () {
}
})
});
#在发起一个ajax请求的时候,因为data永远是一个字符串。要想处理字符串
就必须要用JSON.parse,把字符串转换成对象
这里用来 dataType: 'JSON'
--这样写,在jquery的内部就会拿到这个数据,帮我们做JSON.parse处理,然后把对象返回给我们
如果发生的ajax数据中有列表形式的值,就需要加个 traditional: true
--这样写,后端就会拿到这个列表的值

浙公网安备 33010602011771号