Djanog 的ORM
自定义查询对象 - objects
声明一个类 EntryManager 继承自models.Manager
允许在EntryManager 的类中添加自定义函数
class EntryManager(models.Manager):
def 函数名(self, 自定义参数列表):
...
return ...
使用EntryManager 来覆盖 Models类中原有的objects
#自定义AuthorManager类,用于覆盖Author实体类中的objects
class AuthorManager(models.Manager):
def age_lt(self,age):
return self.filter(age__lt=age)
class Entry(models.Model):
objects = EntryManager()
name = models.CharField()
def titleCount_views(request):
# count = Book.objects.title_count('老王')
# return HttpResponse('包含老王的书籍的数量为%d' % count)
authors = Author.objects.age_lt(45)
for author in authors:
print(author.name,author.age)
return HttpResponse("Query OK")
HttpRequest 请求:
什么是HttpRequest 在Django中就是请求对象的封装体现 里面封装了
请求过程中的所有信息 在Django中HttpRequest被封装成了
request对象 被封装到请求处理视图中作为参数,在调用个视图时自动传入
HttpRequest中的主要内容:
request.scheme 请求的协议
request.body 请求主题
request.path 请求具体资源路径
request.get_host() 请求的主机地址或域名
request.method 请求方法
request.GET 封装了get请求方式所提交的数据
request.POST 封装了POST请求方式所提交的数据
request.COOKIES 封装了cookies中所有数据
request.META 封装了请求的元数据
request.META.HTTP_REFERER
封装了请求的源地址
获取请求数据:
GET请求方式
request.GET["名称"]
POST请求方式
request.POST["名称"]
CSRF cross-site request forgery
跨站点 请求 伪装
解决方案:
1.如果想通过CSRF通过CSRF验证 则需要在表单中的第一行增加
标签:{% csrf_token %}
<form action="/03-post/" method="post">
<!-- 主要用于在服务器端通过 csrf 验证的 -->
{% csrf_token %}
<p>
姓名:<input type="text" name="uname">
</p>
2.
删除settings.py 中MIDDLEWRE中删除中间件
3.在处理函数上增加装饰器
@csrf_protect
表示受保护的请求
使用forms模块处理表单
forms 模块的作用
通过forms模块 允许将表单与class相结合
允许通过 class生成表单
使用froms模块
1.创建一个forms.py模块
2.打入django的forms
from django import forms
3.创建class
一个class对应一个表单
class UserForm(forms.Form):
...
4.在class中创建属性
一个属性到表单中会对应生成一个控件
from django import forms
# 为topic控件初始化数据
TOPIC_CHOICE = (
('1','好评'),
('2','中评'),
('3','差评'),
)
#表示评论内容的表单控件们
#控件1 - 评论标题 - 文本框
#控件2 - Email - Email框
#控件3 - 评论内容 - Textarea
#控件4 - 评论级别 - Select
#控件5 - 是否保存 - Checkbox
class RemarkForm(forms.Form):
# subject - input type='text'
# label 表示的是控件前的文本
subject=forms.CharField(label='标题')
# email - input type='email'
email = forms.EmailField(label='邮箱')
# message - Textarea
# widget=forms.Textarea,表示将当前属性变为多行文本域
message = forms.CharField(label='内容',widget=forms.Textarea)
# topic - Select
topic = forms.ChoiceField(label='级别',choices=TOPIC_CHOICE)
# isSaved - checkbox
isSaved = forms.BooleanField(label='是否保存')
在模板中解析form对象:
需要自定义form表单
在表单中需要自定义按钮
处理方法:
在视图中创建form对象并发送到模板中
def form_views(request):
if request.method == 'GET':
form = RemarkForm()
return render(request,'04-form.html',locals())
手动解析:
在模板中循环解析
{% for field in form %}
{{field}} 表示的就是控件
{{ field.label }} 表示的就是label的值
{% endfor %}
自动解析:
{{ form.as_p }}
将form中的每个属性使用p标记包裹起来再显示的
{{ form.as_ul }}
将form对象中的每个属性使用li标记包裹起来 在显示在网页上
必须手动提供ol或ul标签
{{ form.as_table }}
将form对象的每个属性使用tr标记包裹起来 在显示在网页上
{% csrf_token %}
{% comment '手动解析' %}
{% for field in form %}
<p>
{{ field.label }}:{{ field }}
</p>
{% endfor %}
{% endcomment %}
<ul>
{{ form.as_ul }}
</ul>
在视图中 通过form.Form自动获取表单数据
1.通过forms.Form的构造器来接受post数据
form = xxxForm(request.POST)
2.必须使用form通过验证之后 在取值
form.is_valid()
返回值为True表示数据已通过所有验证 允许取值
返回False提交数据存在未通过验证的 无法取值
3.通过 form.cleaned_data 来接受提交来的数据
# 通过RemarkForm自动接收数据
# 1.将request.POST数据传递给RemarkForm构造器
form = RemarkForm(request.POST)
# 2.验证form对象
if form.is_valid():
# 3.通过验证后获取具体的数据
cd = form.cleaned_data
subject = cd['subject']
email = cd['email']
isSaved = cd['isSaved']
message = cd['message']
topic = cd['topic']
print(subject,email,isSaved,message,topic)
return HttpResponse('Post OK')