Django
1、启动项目app
- 控制台console输入python manage.py startapp app
可使用pycharm快捷方式执行manage.py,后在弹出窗口直接执行start app
2、注册项目app
- 进入setting.py 在 INSTALLED_APPS添加app01.apps.App01Config[项目名称.apps.类名 ]
3 、添加URL
- 在urls.urlpatterns列表中添加path(‘index/’[路由], views.index[路由对应方法])
- 在view中添加方法默认参数request,返回字符串 return HttpResponse(字符串)
- 返回html页面 return render(request, “url.html”[返回的html])
4、开启django 项目
- python manage.py runserver
- pycharm:直接启动django项目
5、静态模板文件
- 项目中添加static文件夹,其中文件夹包含css,img,js,plugins
6、Django模板语法
-
views中方法增加字典返回参数,对应html文件中以{{变量名}}进行调用
-
选择列表中某个元素,则在html中使用{{变量名.下标}}进行选择
-
循环选择列表元素:
<div> {% for item in n2 %} <span>{%item%}</span> {% endfor %} <div/>
-
选择字典的模版语法
-
直接显示字典
<div> {{n3}} </div>
-
通过键值对进行获取
<div> {{n3.key}} #通过键获取值 </div>
-
通过循环取得键或值
<div> {% for item in n3.keys%}#取得所有的键 <span> {{item}} </span> {% endfor%} {% for item in n3.values%}#取得所有的值 <span> {{item}} </span> {% endfor %} </div>
-
条件语句
<div> {% if info.key == "张三"%} {{info.name}} {% else %} {{"key无张三"}} {% endif %} </div>
-
7、获取请求及响应
def some(request):
#request 是一个对象,封装了用户发过来的所有的数据
#获取用户的请求方式
request.method
#获取在url传递值
request.GET
#获取post请求体内的参数
request.POST.get('user')
request.POST.get('pwd')
#将字符串内容返回给浏览器
return HttpResponse
#返回html给浏览器
return render(request,"xxx.html",{key:value})
#重定向
return redirect(url)
8、ORM操作数据库
-
链接数据库
-
在setting.py文件中修改配置DATABASES
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "django", 'USER': 'root', 'PASSWORD': '123456', 'HOST': 'localhost', 'PORT': 3306, } }
-
-
创建,修改,删除表【无法创建数据库】【python版本至少3.9】【项目需要注册在settings】
创建表:在models.py文件中
-
class UserInfo(models.Model): """ ORM根据此类的类型及字段自动创建表等同于sql语句 crate table app01_userinfo( name varchar(32), pwd varchar(64), age int ) 且并会生成一个id列且自增主键 在已有表新增列可给一个默认值例: gender=models.IntegerField(default='male') """ #id=models.BigAutoField(verbose_name='id',primary_key=True) 自行创建bigint类型自增主键 #id=models.AutoField(verbose_name='id',primary_key=True)自行创建int类型自增主键 name=models.CharField(max_length=32) pws=models.CharField(max_length=64) age=models.IntegerField()
执行命令
-
控制台执行命令:
python manage.py makemigrations python manage.py migrate
操作数据
-
增
类名.object.create(字段名1="值",字段名2="值") UserInfo.object.create(name="张三",pws="123")
-
删
类名.object.filter(字段名1="值").delete()#满足filter条件删除 类名.object.all().delete() #全部删除
-
改
data=类名.object.filter(id="值").update(字段="值") #修改满足条件的值 data=类名.object.all().update(字段="值") #修改所有的值
-
查
类名.object.all()#查询所有数据 #返回queryset类型数据,其中为对象 #获取数据 data=类名.object.all() for obj in data: obj.name data=类名.object.filter(id="值") #返回满足条件的queryset对象 data=类名.object.filter(id="值").first #返回满足条件的queryset对象中第一个数据
5.级联删除及设置关联表可为空值
class UserInfo(models.Model): """ 员工表 """ name=models.CharField(verbose_name='姓名',max_length=16) pwd=models.CharField(verbose_name='密码',max_length=64) age=models.IntegerField(verbose_name='年龄') account=models.DecimalField(verbose_name='工资余额',max_length=10,decimal_places=2,default=0) creat_time=models.DateTimeField(verbose_name='入职时间') #加上约束 to:与表关联 to_filed:与表中字段关联,写入数据库是django会将department改成department_id #如果Ddepartment表被删除 #1、把userInfo关联的数据删除-->级联删除 #department=models.ForeignKey(to="Departmanet",to_field="id",on_delete=models.CASCADE) #2、把userInfo关联的数据置空--->设置为空 #department = models.ForeignKey(to="Departmanet", to_field="id", on_delete=models.SET_NULL,null=True,blank=True) #3、给定字段值范围进行创建字段 gender_chioces=( (1,"男"), (2,"女") ) gender=models.SmallIntegerField(verbose_name='性别',choices=gender_chioces)
-
9、模板的继承
-
模板页
需要自定义部分写入{% block content %}{% endlock%}
-
需要使用模板页
#导入模板 {% extends '模板html' %} {% block content %} #自定义内容 {% endblock %}
)]需要自定义部分写入
{% block content %}{% endlock%}
-
需要使用模板页
[外链图片转存中…(img-2csQ2gx9-1721646997271)]
#导入模板 {% extends '模板html' %} {% block content %} #自定义内容 {% endblock %}
10、ModelForm和Form
-
不用组件的缺点
- 用户提交数据无校验
- 页面上无错误提示
- 数据库每个字段需要手动在前端添加
- 展示数据库总的数据,需要手动获取并循环展示在页面
-
From
-
解决前三个问题
-
form基本格式
-
class MyFrom(Form): user=forms.CharField(weiget=forms.TextInput)#自动在前端生成input标签 addr=forms.CharField(weiget=forms.TextInput) #类型 forms.__all__ = ( 'Field', 'CharField', 'IntegerField', 'DateField', 'TimeField', 'DateTimeField', 'DurationField', 'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField', 'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField', 'ComboField', 'MultiValueField', 'FloatField', 'DecimalField', 'SplitDateTimeField', 'GenericIPAddressField', 'FilePathField', 'JSONField', 'SlugField', 'TypedChoiceField', 'TypedMultipleChoiceField', 'UUIDField', ) form #插件 from.__all__ = ( 'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'NumberInput', 'EmailInput', 'URLInput', 'PasswordInput', 'HiddenInput', 'MultipleHiddenInput', 'FileInput', 'ClearableFileInput', 'Textarea', 'DateInput', 'DateTimeInput', 'TimeInput', 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect', 'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget', 'SplitHiddenDateTimeWidget', 'SelectDateWidget', ) def user_add(request): ... form=MyFrom() return render(request,'xx.html',{"form":form})
前端Form书写方式
<form> {{form.user}} </form> <!--等同于--!> <form> <input type="text" name="user"/> </form>
-
-
-
ModleFrom(推荐:数据库某些表的增删改查)
-
解决四个问题
-
ModelForm基本格式
-
models页(数据库新建字段页)
class Departmanet(models.Model): """ 部门表 """ #id=models.BigAutoField(verbose_name='id',primary_key=True) 自行创建bigint类型自增主键 #id=models.AutoField(verbose_name='id',primary_key=True)自行创建int类型自增主键 titile=models.CharField(verbose_name='部门名称',max_length=32) ### 由于UserInfo中department字段与Departmanet中的id进行关联了,在view中返回Departmanet对象,要在前端页面展示verbose_name则: def __str__(self): return self.titile class UserInfo(models.Model): """ 员工表 """ name=models.CharField(verbose_name='姓名',max_length=16) pwd=models.CharField(verbose_name='密码',max_length=64) age=models.IntegerField(verbose_name='年龄') account=models.DecimalField(verbose_name='工资余额',max_length=10,decimal_places=2,default=0,max_digits=10) creat_time=models.DateTimeField(verbose_name='入职时间') #加上约束 to:与表关联 to_filed:与表中字段关联,写入数据库是django会将department改成department_id #如果Ddepartment表被删除 #1、把userInfo关联的数据删除-->级联删除 #department=models.ForeignKey(to="Departmanet",to_field="id",on_delete=models.CASCADE) #2、把userInfo关联的数据置空 #department = models.ForeignKey(to="Departmanet", to_field="id", on_delete=models.SET_NULL,null=True,blank=True) department = models.ForeignKey(to="Departmanet", to_field="id", on_delete=models.SET_NULL, null=True, blank=True) #给定字段值范围进行创建字段 gender_chioces=( (1,"男"), (2,"女") ) gender=models.SmallIntegerField(verbose_name='性别',choices=gender_chioces)
views页面
from django import forms class MyForm(forms.ModelForm):#还支持用户自定义参数 class Meta:#M大写 fields=models.UserInfo#fields=需要model.py的类名 !!!!!!一定要用fields fields=["name","pwd","age".....] widgets={ "name":forms.TextInput(attrs={"class":"from_control","placeholder":"姓名"}) }###在前端加样式 #给所有字段加样式 def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) for name,field in self.fields.items(): field.widget.attrs={"class":"from-control"} def user(request): form=Myform() return render(request,'xxx.html',{"form":form})
前端ModelForm页面
<form> {{% for form in forms %}} {{form.label}}{{form}} <!--可以将form下所有字段循环展示在前端--> <!--#{{form.label}}可以取得model.py中的verbose_name--> {{% endfor %}} </form>
-
-