- 中间件:中间件是 Django 请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变 Django 的输入或输出。
四个方法:
from django.utils.deprecation import MiddlewareMixin 引入MiddlewareMixin
from django.shortcuts import HttpResponse
class Md1(MiddlewareMixin):
def process_request(self,request):
print("mdl process",id(request))在视图之前执行
def process_response(self,request,response):
基于请求响应
print('mdl resonpes',id(request))在视图之后执行
return response
def process_view(self,request,view_func,view_args,view_kawargs):
print("mdl view",id(request))在视图之前,顺序执行
def process_exception(self,request,exception):视图函数错误,才会触发这个方法
print('md1 exception')返回错误信息
return HttpResponse('服务器错误')
在settings文件中引入该应用模型类
2.后台管理:
模型中:
class Cloos(models.Model):
con_name=models.CharField(max_length=20,verbose_name='班级号')在字段中添加ver_bose_name字段来设置汉语名称
mark=models.CharField(max_length=10,verbose_name='班费')
cla_id=models.CharField(max_length=20,verbose_name='教室号')
class Meta:
verbose_name_plural='班级表'
class Student(models.Model):
name=models.CharField(max_length=20,verbose_name='姓名')
arg=models.CharField(max_length=10,verbose_name='年龄')
cloos=models.ForeignKey(Cloos,on_delete=models.CASCADE,verbose_name='班级')
dian=models.CharField(max_length=30,verbose_name='电话')
img=models.ImageField(upload_to='static',verbose_name='头像')
class Meta:
verbose_name_plural='学生表'
def __str__(self):
return self.name
admin文件中:
引入模型类
from .models import Cloos,Student
@admin.register(Cloos)运用@admin.register(表名)方法来设置模型类
class Classa(admin.ModelAdmin):
list_display = ('con_name','mark','cla_id')显示字段
fields = ('con_name','mark','cla_id')修改,添加,字段
@admin.register(Student)
class Studen(admin.ModelAdmin):
list_display = ('name','arg','cloos','dian','img')
fields = ('name','arg','cloos','dian','img')
apps文件中:
class SmanageConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'smanage'
verbose_name='学生管理系统'设置verbose_name来设置后台系统名称
- 从而实现后台管理页面的汉化应用
3.表单组件Form的使用:
创建一个包,建立一个py文件,在文件中:
from django import forms 引入forms class Studentil(forms.Form): name=forms.CharField(label='姓名',required=False)设置label用于命名 content=forms.CharField(label='内容',widget=forms.Textarea) phone=forms.CharField(label='电话')
在URLs中添加路由,在后面添加上as_view()
在views视图函数中
from .studente.studenr import Studentil,Feekmodel引入该包文件中的类 class FeedBackViews(View): def get(self,request): stnd=Studentil()命名该类 return render(request,'studw.html',{'stnd':stnd})在页面中传输该类 def post(self,request): stutd=Studentil(request.POST)用该类接受post传来的数据 if stutd.is_valid():判断该数据是否合乎规矩 data=stutd.cleaned_data接取数据 Studen.objects.create(**data)添加数据,需应用模型类 else: # return HttpResponse('数据不合法') return render(request, 'studw.html', {'stnd': stutd}) return HttpResponse('反馈成功!!')
网页中:
form action="" method="post"> {% csrf_token %} {{ stnd.as_p }}as_p设置类型 <br> <input type="submit" value="添加"> </form>
在form标签中只需加一个input提交和该类命名的变量就可代替添加input列
4.表单高级组件ModelForm的使用:
在文件中引入模型类,创建一个类添加forms.ModelForm
命名该模型类,运用fields添加现实的属性列
在views文件中:
from .studente.studenr import Studentil,Feekmodel class FeedBackViews(View): def get(self,request): stnd=Feekmodel() return render(request,'studw.html',{'stnd':stnd}) def post(self,request): stutd=Feekmodel(request.POST) if stutd.is_valid(): data=stutd.cleaned_data Studen.objects.create(**data) else: # return HttpResponse('数据不合法') return render(request, 'studw.html', {'stnd': stutd}) return HttpResponse('反馈成功!!')
操作基本与form相同
限值操作:
def clean_name(self):clean加属性名设置属性判定方法 if len(self.cleaned_data['name']) < 2:通过self.cleaned_data来进行获取数据来进行限制操作 raise forms.ValidationError('————不能少于两个字————')在页面中提醒错误词 return self.cleaned_data['name'] def clean_content(self): if len(self.cleaned_data['content']) < 6: raise forms.ValidationError('————不能少于六个字————') return self.cleaned_data['content'] def clean_phone(self): if len(self.cleaned_data['phone']) != 11 : raise forms.ValidationError('————必须11个字————') return self.cleaned_data['phone']
5.注册登录:
注册:
def user(request): if request.method=='GET': return render(request,'user.html') if request.method=='POST': username=request.POST.get('username') password=request.POST.get('password') email=request.POST.get('email') User.objects.create_user(username=username,password=password,email=email) return redirect('sman:userd')
注册与普通的orm添加差不多,插入到自带的user中,要在create添加——user创建一般用户,create_superuser -- 创建一个超级用户, 用户名+ 密码 , 创建超级最后用户要添加 邮箱,create创建普通用户
登录:
def userd(request): if request.method=='GET': return render(request,'userd.html',{'request':request}) if request.method=='POST': username=request.POST.get('username') password=request.POST.get('password') user=authenticate(request=request,username=username,password=password) if user is not None: login(request=request,user=user) return redirect('sman:index') return redirect('sman:userd')
登录,在视图函数中接收到页面的数据之后,引入authenticate,使用authenticate进行数据验证,
如果通过就用login进行记录,下次进入就会根据记录进行进入
账号注销:
def logou(request): logout(request=request) return redirect('sman:userd')
引入logout来进行账号的注销
6.文件上传
上传图片:
在模型类中添加一个ImgeField类型的字段,其中upload_to=用来设置图片存入的位置
在网页中form标签添加 enctype="multipart/form-data"属性,在图片的输入框用file类型,进行网页向视图函数的传输,
存入orm后,图片列就会存入位置名称/图片的名称。
第二种方法:
在模型类中,添加CharField类型字段,进行图片的存储,网页中与第一种方法一样。
不过,在视图函数中 运用写入文件的方式进行存储。
7.orm:
简介
ORM:关系对象映射。定义一个类自动生成数据库的表结构。
创建数据库的时候,一般有以下几种常用数据类型:数字、字符串以及时间。
ORM分为两种:
DB First 数据库里先创建数据库表结构,根据表结构生成类,根据类操作数据库
Code First 先写代码,执行代码创建数据库表结构
主流的orm都是code first。django 的orm也是code first,所以学的时候,本质就分为两块:
根据类自动创建数据库表
根据类对数据库表中的数据进行各种操作
在models文件中创建模型类:
模型类创建完成后,执行下列命令:
从而生成orm数据库
进行添加数据:
删除数据:
展示数据:
更新数据: