自定义分页器的拷贝及使用,form组件

自定义分页器的拷贝及使用

#后端
book_queryset = models.Book.objects.all()
current_page = request.GET.get('page',1)
all_count = book_queryset.count()
#1、实例化传值生成对象
page_obj = Pagination(current_page=current_page,all_count=all_count)
#2、对总数据进行切片操作
page_queryset = book_queryset[page_obj.start:page_obj.end]
return render(request,'ab_pl.html',locals())
#前端
{% for book_obj in page_queryset %}
<p>{{book_obj.title}}</p>
<nav aria-label="Page navigation">
</nav>
{% endfor %}
{{page_obj.page_html|safe}}

form组件

'''
写一个注册功能
获取用户名和密码 利用form表单提交数据
在后端判断用户名和密码是否符合一定的条件
      用户名中不能含有金梅
      密码不能少于三位
'''
def ab_form(request):
    back_dict={'username':'','password':''}
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if '金瓶梅' in username:
            back_dict['username'] = '不符合要求'
        if len(password)<3:
            back_dict['password'] = '密码长度要大于3'
    """
     无论是post请求还是get请求
     页面都能够获取到字典 只不过get请求来的时候 字典值都是空的
     而post请求来之后 字典可能有值
     """
    return render(request,'ab_form.html',locals())



<form action="" method="post">
    <p>username:
        <input type="text" name="username">
        <span style="color :red">{{back_dict.username}}</span>
    </p>
    <p>password:
        <input type="text" name="password">

        <span style="color:red">{{back_dict.password}}</span>
    </p>
    <input type="submit" class="btn btn-info">
</form>

'''
1.手动书写前端获取用户数据的html代码                 渲染html代码
2.后端对用户数据进行校验                                 校验数据
3.对不符合要求的数据进行前端提示                       展示提示信息

forms组件
   能够完成的事情
         1.渲染html代码
         2.校验数据
         3.展示提示信息

为什么数据校验非要去后端 不能在前端利用js直接完成呢?
   数据校验前端可有可无
   但是后端必须要有!!!
   
   因为前端的校验是弱不禁风的 你可以直接修改
   或者利用爬虫程序绕过前端页面直接朝后端提交数据
   
   购物网站   
      选取了货物之后 会计算一个价格发送给后端 如果后端不做价格的校验
      
      实际是获取到用户选择的所有商品的主键值
      然后在后端查询出所有商品的价格 再次计算一遍
      如果跟前端一致 那么完成支付如果不一致直接拒绝
'''

基本使用

from django import forms
class MyForm(forms.Form):
    username = forms.CharField(min_length=3,max_length=8)
    password = forms.CharField(min_length=3,max_length=8)
    #email字段必须符合邮箱格式   xxx@xx.com
    email = forms.EmailField()

校验数据

"""
1.测试环境的准备 可以自己拷贝代码准备
2.其实在pycharm里面已经帮你准备一个测试环境
   python console
"""
from app01 import views
# 1 将带校验的数据组织成字典的形式传入即可
form_obj = views.MyForm({'username':'jason','password':'123','email':'123'})
# 2 判断数据是否合法      注意该方法只有在所有的数据全部合法的情况下才会返回True
form_obj.is_valid()
False
# 3 查看所有校验通过的数据
form_obj.cleaned_data
{'username': 'jason', 'password': '123'}
# 4 查看所有不符合校验规则以及不符合的原因
form_obj.errors
{
  'email': ['Enter a valid email address.']
}
# 5 校验数据只校验类中出现的字段 多传不影响 多传的字段直接忽略
form_obj = views.MyForm({'username':'jason','password':'123','email':'123@qq.com','hobby':'study'})
form_obj.is_valid()
True
# 6 校验数据 默认情况下 类里面所有的字段都必须传值
form_obj = views.MyForm({'username':'jason','password':'123'})
form_obj.is_valid()
False
"""
也就意味着校验数据的时候 默认情况下数据可以多传但是绝不可能少传
"""

渲染标签

'''
forms组件只会自动帮你渲染获取用户输入的标签(input select radio checkbox)
不能帮你渲染提交按钮
'''
def index(request):
    #1、先生成一个空对象
    form_obj = MyForm()
    #2、直接将该空对象传递给html页面
    return render(request,'index.html',locals())




<form action="" method="post"></form>
<!--    <p>第一种渲染方式</p>-->
<!--    {{ form_obj.as_p }}-->
<!--    {{ form_obj.as_ul }}-->
<!--    {{ form_obj.as_table }}-->

<!--        <p>第二种渲染方式</p>-->
<!--        <p>{{ form_obj.username.label}}:{{ form_obj.username}}</p>-->
<!--        <p>{{ form_obj.password.label}}:{{ form_obj.password}}</p>-->
<!--        <p>{{ form_obj.email.label}}:{{ form_obj.email}}</p>-->

    <p>第三种渲染方式</p>
    {% for form in form_obj %}
    <p>{{ form.label }}:{{form}}</p>
    {% endfor %}
    
'''
label属性默认展示的是类中定义的字段首字母大写的形式
也可以修改,直接给字段对象加label属性
    username = forms.CharField(min_length=3,max_length=8,label='用户名')

'''

展示提示信息


from django import forms
class MyForm(forms.Form):
    username = forms.CharField(min_length=3,max_length=8,label='用户名',
                               error_messages={
                                   'min_length':'用户名最小3位',
                                   'max_length':'用户名最大8位',
                                   'required':'用户名不能为空'
                               }
                               )
    password = forms.CharField(min_length=3,max_length=8,label='密码',
                               error_messages={
                                   'min_length': '密码最小3位',
                                   'max_length': '密码最大8位',
                                   'required': '用户名不能为空'
                               }
                               )
    #email字段必须符合邮箱格式   xxx@xx.com
    email = forms.EmailField(label='邮箱地址',
                             error_messages={
                                 'invalid':'邮箱格式不正确',
                                 'required': '邮箱不能为空'
                             }
                             )
#自定制错误信息

def index(request):
    #1、先生成一个空对象
    form_obj = MyForm()
    if request.method == 'POST':
        form_obj = MyForm(request.POST)
        print(1)
        if form_obj.is_valid():
            return HttpResponse('OK')
    #2、直接将该空对象传递给html页面
    return render(request,'index.html',locals())
    
       <p>第三种渲染方式</p>
{% for form in form_obj %}
        <p>
            {{ form.label }}:{{ form }}
            <span style="color: red">{{ form.errors.0 }}</span>
        </p>
{% endfor %}
    <input type="submit" class="btn btn-info"> 
    
"""
1.必备的条件 get请求和post传给html页面对象变量名必须一样
2.forms组件当你的数据不合法的情况下 会保存你上次的数据 让你基于之前的结果进行修改
更加的人性化
"""

钩子函数

'''
在特定的节点自动触发完成响应操作
在form组件中有两类钩子
	1、局部钩子
	当你需要给单个字段增加校验规则的时候使用
	2、全局钩子
	当需要给多个字段增加校验规则的时候使用
'''
#钩子函数   在类里面书写即可
    #钩子函数
    #局部钩子
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if '666' in username:
            #提示前端展示错误信息
            self.add_error('username','哈哈哈')
        #将钩子函数钩出来数据在放回去
        return username

    #全局钩子
    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if not confirm_password == password:
            self.add_error('confirm_password','两次密码不一致')

        #将钩子函数钩出来数据在放回去
        return self.cleaned_data

forms组件其他参数及补充知识点

label		字段名
error_messages		自定义报错信息
initial       默认值
required   控制字段是否必填

'''
1、字段没有样式
2、针对不同类型的input如何修改
	text
	password
	date
	radio
	checkbox
'''
'''
widget=forms.widgets.TextInput(attrs={'class':'form-control c1 c2'})
'''
#多个属性值的话,直接空格隔开即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值