views.py from . import models # Create your views here. def welcome(request): s = '你好哇,李银河' return HttpResponse(s) def user_info(request): username = 'changcaixia' username_zh = '常彩霞-使用的replace' return render(request,'welcome.html',{'username_zh':username_zh}) # 下面是模拟render的实现原理 # f = open(r'C:UsersliuliPycharmProjectssszsky emplateswelcome.html',encoding='utf-8') # content = f.read() # new_content = content.replace('{{ username_zh }}',username_zh) # return HttpResponse(new_content) def index(request): categories = models.Category.objects.all() #从数据库取到所有数据 articles = models.Article.objects.all() return render(request,'index.html',{'categories':categories,'articles':articles}) models.py from django.db import models # 创建分类表 class Category(models.Model): # 分类名称是不能重复的,所以要加unique=True name = models.CharField(verbose_name='分类名称',max_length=20,unique=True) create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) update_time = models.DateTimeField(verbose_name='更新时间', auto_now=True) # 修改了表结构,只要修改了表结构,就要执行python manage.py makemigrations,python manage.py migrate class Meta: db_table = 'category' #创建表的时候表名 verbose_name = '分类' verbose_name_plural = verbose_name ordering = ['create_time','name'] #默认升序,可以根据多个字段排序 # ordering = [-'create_time'] #降序 def category_fun(): return 883 # Create your models here. class Article(models.Model): # 如果是CharField类型的话,必须得写最长的字符串是多少max_length # title = models.CharField(verbose_name='标题', max_length=25,default='',blank=True) default是默认的标题,如果文章标题可以为空的话,加blank=True, title = models.CharField(verbose_name='标题',max_length=25) #对应数据库的varchar类型,字符串 content = models.TextField(verbose_name='文章内容') #长文本类型,文本比较大的时候用它,如果用TextField,就不用指定max_length, CharField存比较短的字符串 img = models.ImageField(upload_to='article',blank=True) #upload_to代表上传到哪里 category = models.ForeignKey(Category,on_delete=models.SET(category_fun),db_constraint=False,verbose_name='分类') # category = models.ForeignKey(Category, on_delete=models.CASCADE) #假如分类被删除,文章也会被删除 ''' db_constraint=False 实际不会真的在表里面创建外键关系, on_delete=models.PROTECT 删除关联数据,引发错误ProtectedError,是受保护的,不让删除,由django级别抛出的, 只要这个分类下面有文章,这个分类就不能被删除 on_delete=models.DO_NOTHING 假如分类下面有2个文章,分类被删除,文章不受影响 on_delete=models.CASCADE 关联的数据也会被删除;假如分类下面有2个文章,文章被删除,文章里面的分类也会被删除 on_delete=models.SET_NULL分类被删除,分类被设置成空,前提是允许这个字段为空 on_delete=models.SET_DEFAULT分类被删除,分类被设置成默认值,前提是这个字段有默认值 on_delete=models.SET 指定一个函数,分类被删除后调用传过来的方法,用方法返回值 比如执行这条删除命令后,查看效果models.Category.objects.get(id=5).delete() ''' create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True) #自动创建时间,只对时间类型有效 update_time = models.DateTimeField(verbose_name='更新时间',auto_now=True) #自动修改时间,只对时间类型有效 class Meta: db_table = 'article' #创建表的时候表名 verbose_name = '文章表' verbose_name_plural = verbose_name ordering = ['create_time'] #默认升序,可以根据多个字段排序 # ordering = [-'create_time'] #降序 # 默认的表名:sky_user_category :app的名字+类名 tests.py from django.test import TestCase import os,django # Create your tests here. # 先定义,再导入,如果不定义就导入就会报错,因为你还没有设置配置文件,他不知道从哪个目录导入 os.environ.setdefault('DJANGO_SETTINGS_MODULE','sky.settings') django.setup() from sky_user import models # 基本的增删改查 #增 '''方式1''' category = models.Category(name='Java') category.save() '''方式2''' models.Category.objects.create(name='明天要考试啦') models.Category.objects.create(name='加油啊') ''' 方式1和方式2的区别: 方式1,一次只能增加一条;方式1采用实例化的方法,需要手动save一下 方式2,一次可以增加多条;方式2不需要save ''' # 删 # 单个删除 c1 = models.Category.objects.get(id =4) c1.delete() # 批量删除 q = models.Category.objects.filter(name='python1') q.delete() # 改 ''' 方式1:单个数据修改 ''' c1 = models.Category.objects.get(id =3) c1.name = 'Java' c1.save() ''' 方式2 ''' q = models.Category.objects.filter(name='Python') q.update(name = 'python1') # print(dir(q)) 查询有哪些方法的命令 # 查 ''' 方法1:get get只能返回一条数据,如果返回多条会报错,就是指定的条件必须是唯一的, 如果指定的条件查询不到数据,也会报错,但是查询条件可以有多个 返回的c1是一个对象,要取值的话,方法如下''' c1 = models.Category.objects.get(id =1) c1 = models.Category.objects.get(name ='Python') # 条件不唯一,会报错 c1 = models.Category.objects.get(name='Linux',id =2) #多个查询条件 print(c1.name) print(c1.id) '''方法2: filter''' query_set = models.Category.objects.filter(id =1,name='Python') #返回的是list,即使只有一条数据,()里面有多个值就是多个查询条件,相当于and query_set = models.Category.objects.filter() #什么条件也不传,就是查询全部的 print(query_set) # c = query_set.first() #查询第一条数据 c = query_set[0] #查询第一条数据,也可以通过下标来取值 print(c.id) print(c.name) # models.Category.objects.all() #也是查询所有的数据 # 在文章表插入外键的两种方式 c = models.Category.objects.get(id=5) a = models.Article(title='django项目配置',content='django项目配置django项目配置django项目配置',category=c) a.save() a2 = models.Article(title='django项目配置',content='django项目配置django项目配置django项目配置',category_id=6) a2.save() a2 = models.Article(title='mary项目配置',content='mary项目配置django项目配置django项目配置',category_id=7) a2.save() # 查询外键的方式 a = models.Article.objects.get(id=1) print(a.title) print(a.category.name) print(a.category.id) templates下面的index.html 文章内容返回的代码: <div class="summary-list"> {% for article in articles %} <div class="media mb-1 mb-sm-2 p-2 p-lg-3"> <div class="align-self-center mr-2 mr-lg-3 w-25 modal-open"> <a href="./detail.html" target="_blank"> <img class="w-100 article-img" src="https://tendcode.com/cdn/article/191029/python_shell.png" alt="{{article.title}}"> </a> </div> <div class="media-body"> <div class="text-muted mb-2 f-12"> <img class="avatar" src="https://tendcode.com/media/avatar/2019/07/27/91ef76c6a7efce1b99717f97a851f3deb48f6510.png" alt="Hopetree"> <span>Hopetree</span> <span><i class="fa fa-calendar-times-o ml-2 mr-1"></i>2 周,3天前</span> </div> <h2 class="mt-0 font-weight-bold text-info f-17"> <a href="/article/yaml_and_jinja2/" target="_blank">{{article.title}}</a> </h2> <p class="d-none d-sm-block mb-2 f-15">{{article.content}}</p> <div class="text-muted mb-0 f-12"> <a class="cate" href="/category/hello-python/" title="查看当前分类下更多文章"> <i class="fa fa-book mr-1"></i>{{article.category.name}}</a> <span><i class="fa fa-eye ml-2 mr-1"></i>226</span> <a href="/article/yaml_and_jinja2/#comment-block" target="_blank" title="查看文章评论"> <i class="fa fa-comments ml-2 mr-1"></i>8</a> </div> </div> </div> {% endfor %} 文章分类返回的代码: {% for category in categories %} <li class="list-group-item d-flex justify-content-between align-items-center pr-2 py-2"> <a class="category-item" href="./category.html" title="查看{{category.name}}分类下所有文章">{{category.name}}</a> <span class="badge text-center" title="当前分类下有6篇文章">6</span> </li> {% endfor %}