HttpRequest - 请求
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['名称']
request.GET.get('名称')
# 使用表单提交数据
<form method='get'></form>
# 通过地址拼查询字符串
<a href="地址?参数1=值1&参数2=值2"></a>
# 该写法属于Django表准并非Http标准,不能用 request.GET[]
url(r'^xxx/(\d+)')
post 请求方式
request.POST['名称']
# Django的自带验证机制
# CSRF:Cross-Site Request Forgery 跨站点请求伪装
# 解决方案:
# 需要在表单中的第一行增加:{%csrf_token%} (推荐)
# 取消 csrf 的验证 -> 删除 settings.py 中 MIDDLEWARE 中 CsrfViewMiddleware 中间件
# 在处理函数上增加装饰器 @csrf_protect
使用forms模块处理表单
forms模块的作用
通过forms模块,允许将表单与class相结合,允许通过class生成表单
使用forms模块
# 1.创建 forms.py 文件
# 2.导入 django 的 forms
from django import forms
# 3.创建 class ,一个 class 对应生成 一个表单
class ClassName(forms.Form)
pass
# 4.在 class 中 创建属性
# 一个属性对应到表单中会生成一个控件
在模板中解析 form 对象
注意
- 需要自定义
<form>
- 需要自定义按钮
处理方法
在视图中创建form
的对象,并发送到模板中
form = RemarkForm()
return render(request,'xxx.html',locals())
在模板中解析 form 对象
- 手动解析
{% for field in form %}
{{field}} # 表示的就是控件
{{field.label}} # 表示的是控件中lable的值
{% endfor %}
- 自动解析
// 将form对象中的每个属性使用p标记包裹起来,再显示
{{form.as_p}}
// 将form对象中的每个属性使用li标记包裹起来,再显示在网页上
// 注意:必须手动提供<ol></ol> 或 <ul></ul>
{{form.as_ul}}
// 将form对象中的每个属性使用tr标记包裹起来,再显示在网页上
// 注意:必须手动提供 <table>
{{form.as_table}}
在视图中通过 forms.Form自动获取表单数据
# 通过 forms.Form 的构造器来接收post数据
form = XXXForm(request.POST)
# 必须使form通过验证之后,再取值
form.is_valid()
# 返回True:提交的数据已通过所有验证,允许取值
# 返回False:提交的数据未通过验证,无法取值
# 获取表单中的数据
data = form.cleaned_data
forms模块的高级处理
将 Models 和 Forms 结合到一起使用
# 在 forms.py 中创建 class,继承自 forms.ModelForm
class User(models.Model):
uphone = models.CharField(max_length=11)
upwd = models.CharField(max_length=20)
# 创建内部类 Meta,去关联 Model
class LoginForm(forms.ModelForm):
class Meta:
# 指定要关联的实体类
model = User
# 指定从Model中取哪些字段生成控件
# 取值 "__all__",表示全部属性都要生成控件
# 取值 列表,声明允许生成控件的属性名
fields = '__all__'
# 指定每个属性所关联的label,取值为字典
labels = {
'uphone':'手机号',
'upwd':'密码',
}
内置小部件
小部件(widget),表示的是生成到页面上的控件的类型以及其他的html属性
常用小部件类型
TextInput : type="text"
PasswordInput : type="password"
NumberInput : type="number"
EmailInput : type="email"
URLInput : type="url"
HiddenInput : type="hidden"
CheckboxInput : type="checkbox"
Textarea : <textarea></textarea>
Select : <select></select>
小部件的使用
继承自 forms.Form
- 基本版
只指定控件的类型
class RemarkForm(forms.Form):
属性 = forms.CharField(
label='文本',
widget=forms.小部件类型
)
- 高级版
指定控件类型的基础上还允许设置html的一些相关属性
属性 = forms.CharField(
label='文本',
widget=forms.小部件类型(
attrs = {
'html属性名':'属性值',
'html属性名':'属性值',
}
)
)
继承自 forms.ModelForm
class XXXForm(forms.ModelForm):
class Meta:
model = User
fields = "__all__"
labels = {
'属性1':'Label1',
}
# 在之前的基础上增加 widgets 属性
widgets = {
'属性1':forms.小部件类型(attrs={})
}
网友评论