今天主要内容:Django Form、Django Admin、Django进阶
Django Admin
自带的验证:
Django Admin的定制
Django Admin 自定义actions:
注册modelAdmin的时候也可是使用下面的方法:
from django.contrib import admin from app01 import models # 定制book的Django admin管理 @admin.register(models.Book) class BookAdmin(admin.ModelAdmin): # 定义要在admin界面显示的字段,注意list_display默认是不能显示many_to_many字段的。 list_display = ["id", "title", "publisher", "publication_Date", "colored_status"] ...
前端颜色展示:
from django.db import models from django.utils.html import format_html class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_Date = models.DateField() status_choice = ( ("published", "已出版"), ("producing", "待出版"), ("forbidden", "禁书"), ) status = models.CharField(choices=status_choice, max_length=32, default="producing") def colored_status(self): """ 在前端给状态字段根据不同状态添加不同的背景色 Django 1.7之后需要format_html将字符串渲染一下 用该函数名(colored_status)替换在model Admin中list_display中的status即可。 :return: """ global format_td if self.status == "published": format_td = format_html('<span style="padding:2px;background-color:yellowgreen;color:white">已出版</span>') elif self.status == "producing": format_td = format_html('<span style="padding:2px;background-color:pink;color:white">待出版</span>') elif self.status == "forbidden": format_td = format_html('<span style="padding:2px;background-color:orange;color:white">禁书</span>') return format_td colored_status.short_description = "状态" def __str__(self): return "《{}》".format(self.title) class Meta: verbose_name_plural = "书名"
单表内查询:
all_entries = Entry.objects.all() #查询所有 Entry.objects.filter(pub_date__year=2006) #查询所有pub_date为2006年的纪录 Entry.objects.all().filter(pub_date__year=2006) #与上面那句一样 >>> Entry.objects.filter( #链式查询 ... headline__startswith='What' ... ).exclude( ... pub_date__gte=datetime.date.today() ... ).filter( ... pub_date__gte=datetime(2005, 1, 30) ... ) one_entry = Entry.objects.get(pk=1) #单条查询 Entry.objects.all()[:5] #查询前5条 Entry.objects.all()[5:10] #你猜 Entry.objects.order_by('headline')[0] #按headline排序取第一条 Entry.objects.filter(pub_date__lte='2006-01-01') #相当于sql语句SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01'; Entry.objects.get(headline__exact="Cat bites dog") #相当于SELECT ... WHERE headline = 'Cat bites dog'; Blog.objects.get(name__iexact="beatles blog") #与上面相同,只是大小写不敏感 Entry.objects.get(headline__contains='Lennon') #相当 于SELECT ... WHERE headline LIKE '%Lennon%';
单表内查询语句
关联查询:(了不起的双下划线)
#This example retrieves all Entry objects with a Blog whose name is 'Beatles Blog': Entry.objects.filter(blog__name='Beatles Blog') Blog.objects.filter(entry__headline__contains='Lennon')
关联查询
Django models之F:对同一表内的不同字段进行查询
from django.db.models import F Entry.objects.filter(n_comments__gt=F('n_pingbacks'))
从Entry表中找出所有评论数大于等于引用数的。
Entry.objects.filter(n_comments__gt=F('n_pingbacks') * 2)
从Entry表中找出所有评论数大于等于引用数2倍的。
Entry.objects.filter(rating__lt=F('n_comments') + F('n_pingbacks'))
从Entry表中找出所有rating小于等于评论数和引用数之和。
from datetime import timedelta Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))
从Entry表中找出所有发布3天以后修改的。