一:# 有约束
# to,与**表关联
# to_field 与**表中的*列关联
# django 自动
# 写的depart 自动生成depart_id, on_delete=models.CASCADE 级联删除,比如这个专业没有了删除相应学生
depart = models.ForeignKey(to='Team', to_fields='temid',on_delete=models.CASCADE)
# 也可以让学生专业为空
# 不删除学生,将学生专业置空
depart = models.ForeignKey(to='Team', to_fields='temid',blank=True,null=True,on_delete=models.SET_NULL)
二:# 在django 中做约束
gender_choices=(
(1,'男'),
(2,'女'),
)
gender = models.SmallIntegerField(verbose_name='性别',choices=gender_choices)
# 这里如果在前端html中取值的时候 需要加入get_
三:# 在html 中如果要跳转到新页面则href
四:模板的继承(比如导航栏的样式 可以继承)
模板文件中 <div>
{% block content %}
{% endblock %}
</div>
然后要集成的 {% extends ‘模板文件.html’ %}
{% block content %}
数据
{% endblock %}
五:你要插入时间数据的话 获取的值是datatime类型的 可以转化为字符串
datetime转化为字符串
form datetime import datetime
dt = datetime.now()
res = dt.strftime(“%Y-%m-%d-%H-%M”)
print(res)
【but 在html中需要使用该语法{{obj.create_time|date:"Y-m-d"}}】
六:在设计数据库的时候 可能会这样设计
gender_choices = (
(1, '男'),
(2, '女'),
)
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
for obj in queryset
obj.gender #1/2
obj.get_gender_display() #get_字段名称_diaplay()
【but 在html 中不允许加入括号obj.get_gender_display】
七:如果连接外键 【depart = models.ForeignKey(to='Team', to_fields='temid',on_delete=models.CASCADE)
这里生成的是 depart_id】
了如何通过这个表的值获得另一个表的外键对应的数据,可以↓方法一
for obj in q:
obj.depare_id
xx = models.外键所在的表名.objects.filter(id= 外键).first()
xx.外键所对应数据的列名
方法二↓:django 自动
for obj in q:
obj.depare_id#获取数据库中存储的那个字段值
obj.depart.title#根据id自动去关联表中获取哪一行数据depart对象 所以可以.title title是这个id这个行中的列【这里默认是id 和title 两列】
八:from django.db.models import Count
# 假设我们有一个名为Book的模型,并且其中有一个字段为category表示书籍的分类
# 查询每个分类下的书籍数量
results = Book.objects.values('category').annotate(total_books=Count('id'))
# 打印结果
for result in results:
print(f"Category: {result['category']}, Total books: {result['total_books']}")
九 :form组件
view.py中
创建一个类class MyForm(django中的form)
class MyForm(Form)
user=forms.CharField(widget=form.Input)
pwd =form.CharFiled(widget=form.Input)
email =form.CharFiled(widget=form.Input)
def user_add(request):
if request.method =="GET":
form = MyForm()
# 实例化一个对象
return render(request,"user_add.html",{“form”:form})
.html中
<form method="post">
{% for filed in form %}
{{filed}}
{% endfor %}
<!-- 上述代替这里了
{{form.user}}
{{form.user}}
{{form.user}}
-->
<!-- 上述代替这里了
<input type = "text" class="form-control" placeholder="姓名" name=“user”/>
<input type = "text" class="form-control" placeholder="姓名" name=“user”/>
<input type = "text" class="form-control" placeholder="姓名" name=“user”/>
-->
</form>
十: modelform
models.py
class Student(models.Model):
'''学生信息'''
stuid = models.CharField(verbose_name='学号', primary_key=True, max_length=32, blank=False, null=False)
name = models.CharField(verbose_name='姓名', max_length=32, blank=False, null=False)
gender_choices = (
(1, '男'),
(2, '女'),
)
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
teamid = models.CharField(verbose_name='所在班级', max_length=32, blank=False, null=False)
view.py
class MyForm(ModelForm)
xx = form.CharField*("...")
class Meta:
model = Student
fields =["stuid","name","gender","teamid","xx"]
十一:
class SMF(forms.ModelForm):
class Meta:
model = models.Student
# fields = [file for file in models.Student.objects.all()]
# fields = ["stuid", 'name', 'teamid']
fields = []
for field in models.Student.objects.all():
fields.append(field)
定义一个名为 SMF 的表单类,并且通过 Meta 类中的 fields 属性指定表单中要包含的字段。
这个类中 必须需要一个fields 或者 exclude 然后因为查询到的结果是对象 所以需要使用
fields = [field.name for field in models.Student._meta.get_fields()]
获取表单前面的名字 并将查询到的对象转化为字符串
十二:
fields = [field.name for field in models.Student._meta.get_fields()]
widgets = {
"name": forms.TextInput(attrs={"class": "form-control"})
"password":forms.PasswordInput(同上)
}
实际开发:这个函数和上面的class Meta为并列关系
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循环找到所以插件 添加class
for name, field in self.fields.items():
field.widget.attrs = {"class": "form-control"}
十三:数据效验
form.save()函数自动提交数据存储到表中
十四:错误信息
提示英文,改成中文 在settings 这里改为 LANGUAGE_CODE = 'zh-hans'
十五:
# for i in range(100):
# models.Score.objects.create(stuid="2021030441023", couid="123456", teamid="666")
# select * form 表 order by id asc;按照id 升序排序 desc 降序排序
# models.Score.objects.all().order_by("id") 这是 asc "-id"这是dsc
# models.Score.objects.filter(id__gt=12) 大于12 针对数字
# models.Score.objects.filter(id__gte=12) 大于等于12 针对数字
# models.Score.objects.filter(id__lt=12) 小于12 针对数字
# models.Score.objects.filter(id__lte=12) 小于等于12 针对数字
# models.Score.objects.filter(stuid__startswith=2021) 以2021开头 针对字符串
# models.Score.objects.filter(stuid__endswith=2021) 以2021结尾 针对字符串
# models.Score.objects.filter(stuid__contains=2021) 包含2021 针对字符串
# q = models.Score.objects.filter(stuid='2021030441023', id=1)
# print(q)
十六
# ModelForm可以帮助我们生成HTML标签。
class UserModelForm(forms.ModelForm):
name=forms.CharField(min_length=3,label="用户名")
class Meta:
model models.UserInfo
fields=【"name","password",】
form UserModelForm()
# 在html中
{{form.name)) # 普通的input框
{{form.password))# 普通的input框
# 定义插件 1.
class UserModelForm(forms.ModelForm):
class Meta:
model models.UserInfo
fields ["name","password",]
widgets ={
"name":forms.TextInput(attrs={"class":"form-control")),
"password":forms.PasswordInput(attrs={"class":"form-control")),
"age":forms.TextInput(attrs={"class":"form-control")),
}
2.
class UserModelForm(forms.ModelForm):
name forms.CharField(
min length=3,
1abe1="用户名",
widget=forms.TextInput(attrs={"class":"form-control"))
)
class Meta:
model models.UserInfo
fields ["name","password","age"]
上述都太繁琐了,重新定义的init方法,批量设置
class UserModelForm(forms.ModelForm):
def init(self,*args,**kwargs):
super().init(*args,**kwargs)
## 循环modelform 中的所有字段 给每个字段的插件设置
for name,field in self.fields.items():
# 字段中有属性,保留原来的属性,没有属性才增加
if ield.widget.attrs:
field.widget.attrs["class"] = "from-control"
else:
field.widget.attrs ={
"class":"form-control",
"placeholder":field.label}
class UserEditModelForm(BootStrapModelForm)
class Meta:
model= models.UserInfo
fields =["name","password","age",]
十七: # fields = "__all__"
# 排除level
exclude = ["stuid"]
十八:
http https
这是无状态&短链接
无状态 :断开连接以后,再次发送请求,会将你认为是一个新人(即服务器 认为你以前没有请求过)
短连接 :一次请求和响应以后会断开连接
什么是cookie 和session
浏览器向网站发送请求
网站响应两类数据 ------响应体(网页上看到的内容)响应头(cookie)
网站会划分一个“小格子”存储你以前的cookie值 这里叫session(数据库(django默认),redis,文件)