0、子应用
子应用目录结构
配置子应用
1、创建表
创建模型:models.py
1 from django.db importmodels2
3 #Create your models here.
4
5 classCategory(models.Model):6 #默认表名为appname_classname
7 name = models.CharField(verbose_name='分类名称',max_length=20,unique=True)8 create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)9 update_time = models.DateTimeField(verbose_name='修改时间',auto_now=True)10
11 classMeta:12 db_table = 'category' #创建表的表名
13 verbose_name = '分类'
14 verbose_name_plural =verbose_name15 ordering = ['-create_time','name']16
17 def __str__(self):18 return self.name
1 classArticle(models.Model):2 title = models.CharField(verbose_name='标题',max_length=25) #varchar
3 content = models.TextField(verbose_name='文章内容')4 img = models.ImageField(upload_to='article',blank=True)5 #db_constraint = Fasle,不会真的创建外键关联
6 category = models.ForeignKey(Category,on_delete=models.DO_NOTHING,db_constraint=False,verbose_name='分类')7 create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)8 update_time = models.DateTimeField(verbose_name='修改时间',auto_now=True)9
10 classMeta:11 db_table = 'article' #创建表的表名
12 verbose_name = '文章'
13 verbose_name_plural =verbose_name14 ordering = ['-create_time']15
16 def __str__(self):17 return self.title
生成表
生成表结构:python3 manage.py makemigrations
同步表结构到数据库:python3 manage.py migrate
2、表操作:增删改查;test.py
分类
from django.test importTestCaseimportos,django#Create your tests here.
#设置django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings')
django.setup()from user importmodels#增加
#方式一
category = models.Category(name='Python')
category.save()#方式二
models.Category.objects.create(name='Jmeter')
models.Category.objects.create(name='Vue')
models.Category.objects.create(name='Postman')#查询
#只能返回一条数据,返回多条会报错#如果指定的条件未匹配成功,也会报错
c1 = models.Category.objects.get(id=1)print(c1.name)print(c1.id)#返回的是一个list
query_set = models.Category.objects.filter(name='Python',id=1)print(query_set)
c=query_set.first()
c1=query_set[0]print(c.name)print(c1.name)from django.test importTestCaseimportos,django#Create your tests here.
#设置django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings')
django.setup()from user importmodels#删除
#方式一:单个删除
c1 = models.Category.objects.get(id=1)
c1.delete()#方式二:批量删除
q = models.Category.objects.filter(name='python1')
q.delete()#修改
#方式一:单个修改
c1 = models.Category.objects.get(id=2)
c1.name='Java'c1.save()#方式二:批量修改
q = models.Category.objects.filter(name='Python')
q.update(name='python1')
文章
已有分类
创建文章
from django.test importTestCaseimportos,django#Create your tests here.
#设置django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings')
django.setup()from user importmodels#增加文章
c1 = models.Category.objects.get(id=2)
a1= models.Article.objects.create(title='Jmeter',content='参数化',category=c1)
a1.save()
a2= models.Article.objects.create(title='Java',content='sprint boot项目 hello world!!',category_id=4)
a2.save()#查询某个分类下的所有文章
c_obj= models.Category.objects.get(name='Jmeter')print(c_obj)#方法一:手动通过分类查询文章
num= models.Article.objects.filter(category=c_obj)print(num)#方法二:一对多的时候,通过1,反查多
print(c_obj.article_set.all())
3、通过web页面请求创建文章
项目结构
编写views.py
from django.http importHttpResponseRedirectfrom django.shortcuts importrender,HttpResponsefrom . importmodelsdefarticle(request):print(request.method) #请求方式
print(request.GET) #通过url传参的方式,通过该方式获取请求值
print(request.POST) #获取请求值
print(request.COOKIES)print(request.path_info) #请求的路径 /post /cate
print(request.FILES) #获取文件
print(request.META) #请求头相关的都在这里
print(request.body) #body里面的内容
#创建文章
if request.method=='GET':return render(request,'post.html')else:
title= request.POST.get('title')
content= request.POST.get('content')
category= request.POST.get('category')
models.Article.objects.create(title=title,content=content,category_id=category)return HttpResponseRedirect('/')
配置urls.py
from django.contrib importadminfrom django.urls importpathfrom user importviews
urlpatterns=[
path('admin/', admin.site.urls),
path('index',views.user_info),
path('welcome',views.welcome),
path('',views.index),
path('category/',views.category),
path('post',views.article) #创建文章
]
模板文件:post.html
Title{#django默认启用了csrf验证#}{% csrf_token %}
写文章的
{% for category in categories %}{{ category.name }}{% endfor %}
4、前端公共部分,复用
base.html
category.html
5、后端公共部分,复用:上下文管理器(如果每个view都需要返回同样的数据,那么就可以考虑使用上下文管理器;可写多个)
查询某个分类下的所有文章(页面右边需显示所有分类)
分类业务处理:views.py、urls.py
from django.http importHttpResponseRedirectfrom django.shortcuts importrender,HttpResponsefrom . importmodelsdefcategory(request,id):#只返回了某个分类,分类页面显示的文章分类列表为公共部分,通过上下文管理器处理获得
category_obj = models.Category.objects.get(id=id)
articles= models.Article.objects.filter(category=category_obj)return render(request,'category.html',{'articles':articles,'category_obj':category_obj})
from django.contrib importadminfrom django.urls importpathfrom user importviews
urlpatterns=[
path('admin/', admin.site.urls),
path('index',views.user_info),
path('welcome',views.welcome),
path('',views.index),
path('category/',views.category), #查询分类下的所有文章
path('post',views.article)
]
创建&配置上下文管理器
创建
代码如下
from . importmodelsdefprocess_category(request):print('上下文处理器')
categories=models.Category.objects.all()return {'categories':categories}
配置
请求流程图
6、中间件
应用:可利用实现mock接口平台开发
models.py
#mock平台开发
classInterface(models.Model):
name= models.CharField(verbose_name='接口名称',max_length=50)
path= models.CharField(verbose_name='接口路径',max_length=60,unique=True)
response= models.TextField(verbose_name='返回数据')classMeta:
db_table= 'interface'verbose_name= '接口'verbose_name_plural=verbose_namedef __str__(self):return self.name
middle_wares.py
from django.http importHttpResponsefrom django.middleware.common importMiddlewareMixinfrom . importmodelsclassTestMiddleWare(MiddlewareMixin):defprocess_request(self,request):#请求过来之后先走到这里
#利用中间件实现mock接口平台开发
print('request...')
path=request.path_info
interface= models.Interface.objects.filter(path=path).first()#print(interface)
ifinterface:returnHttpResponse(interface.response)#print(request.META)
defprocess_response(self,request,response):#拦截返回的
print('response...')returnresponsedefprocess_exception(self,request,exception):#拦截异常的
print('出异常了')return HttpResponse("努力抢救中!")
配置
请求示例
已有接口
请求
7、django自带的admin管理系统
创建用户命令:python3 manage.py createsuperuser
编写admin.py
from django.contrib importadmin#Register your models here.
from . importmodelsclassArticleAdmin(admin.ModelAdmin):
list_per_page= 10 #每页最多展示多少条数据
list_display= ['id','title','img','create_time'] #展示哪些字段
list_filter= ['category'] #按照哪些字段来筛选
search_fields= ['title','content']classCategoryAdmin(admin.ModelAdmin):
list_per_page= 10 #每页最多展示多少条数据
list_display= ['id', 'name', 'create_time'] #展示哪些字段
list_filter= ['name'] #按照哪些字段来筛选
search_fields= ['name']classInterfaceAdmin(admin.ModelAdmin):
list_per_page= 10 #每页最多展示多少条数据
list_display= ['id','name'] #展示哪些字段
search_fields= ['name']
admin.site.register(models.Article,ArticleAdmin)
admin.site.register(models.Category,CategoryAdmin)
admin.site.register(models.WebSite),
admin.site.register(models.Interface,InterfaceAdmin)
问题:已解决
升级:pip install django==2.1.7
pip3 install Django –upgrade
查看Django版本: python3 -m django --version
删除已有数据库
重新生成:
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuser