表单验证
逻辑处理,创建表单验证模块里的验证类,并将用户请求的POST对象,传入验证类进行验证,验证后获取验证通过的提交信息,或者验证没通过的错误信息
如果出现错误,将错误信息对象以字典方式传到html页面
is_valid() 返回验证是否通过的布尔值
使用方式:验证类.is_valid()
cleaned_data 获取验证通过后的所有提交数据,返回字典
使用方式:验证类.cleaned_data
errors 获取验证错误信息,返回所有表单的错误信息对象
使用方法:验证类.errors
常用的内置验证字段
字段 | 用法 |
---|---|
EmailField() | 验证邮箱字段 |
CharField() | 验证字符串字段 |
URLField() | 验证url地址字段 |
IntegerField() | 验证数字字段 |
GenericIPAddressField() | 验证IP字段 |
注意:虽然有很多内置验证字段,但是我们还是要根据我们自己的需求来验证
验证字段的参数
required设置字段是否可以为空
True不可以为空
False可以为空
max_length最大字符数
min_length最小字符数
error_messages自定义错误提示信息
参数是一个字典{'验证名称':'错误提示'}
widget设置表单字段在html页面的类型
使用方式:widget=forms.Textarea()
Textarea(): <textarea>标签类型
TextInput():<input>标签类型
attrs给表单标签设置属性,可以给标签元素设置class样式,和input标签的各种type属性
Select生成表单,select标签,下拉选项框
参数:
choices设置下拉数据,元组类型
attrs设置select标签属性
自定义验证规则
validators设置自定义验证规则,参数是一个列表,列表里是自定义验证方法名称
form.py
from django import forms
class AddArtForm(forms.Form):
title = forms.CharField(min_length=5, required=True)
desc = forms.CharField(min_length=20, required=True)
content = forms.CharField(required=True)
views.py
if request.method == 'POST':
# 把表单数据交给AddArtForm做验证
form = AddArtForm(request.POST)
# is_valid()验证参数是否有效,如果验证成功,返回True,否则返回False
if form.is_valid():
# 表示验证成功
title = form.cleaned_data['title']
desc = form.cleaned_data['desc']
content = form.cleaned_data['content']
Article.objects.create(title=title, desc=desc, content=content)
# 创建成功文章后,返回文章列表页面
# return HttpResponseRedirect('/article/art/')
return HttpResponseRedirect(reverse('art:art_list'))
else:
# 表示字段验证失败,需要将错误信息返回给页面展示
# errors = form.errors
return render(request, 'add_article.html', {'form': form})
反向解析
随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一些超链接忘记修改,有办法让链接根据正则表达式动态生成吗? 就是用反向解析的办法。
projiect的urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'article/', include('article.urls', namespace='art'))
]
app的urls.py
urlpatterns = [
# 创建文章
url(r'^add_art/', views.add_art, name='add'),
# 文章列表
url(r'^art/', views.art, name='art_list'),
]
访问url时的写法:
reverse(namespace : name)
# 创建成功文章后,返回文章列表页面
# return HttpResponseRedirect('/article/art/')
return HttpResponseRedirect(reverse('art:art_list'))
HTML中的写法:
<a href="{% url 'art:add' %}">添加文章</a>
分页
要使用Django实现分页器,必须从Django中导入Paginator模块
from django.core.paginator import Paginator
方法 | 说明 |
---|---|
paginator.count | 统计数据的条数 |
get_page | 用来处理用户的非法输入--------->page_of_blogs = paginator.get_page(page_num) |
page_range | 用来显示底部页码 |
num_pages | 显示总的页数 |
page = paginator.page() | 获取某一页 |
page.number | 显示当前页的页码 |
has_previous | 判断是否存在上一页 |
has_next | 判断是否存在下一页 |
previous_page_number | 当前页的上一页页码 |
next_page_number | 当前页的下一页页码 |
views.py
def art(request):
if request.method == 'GET':
# 文章列表页面
page = int(request.GET.get('page', 1))
articles = Article.objects.all()
# 将所有数据按照每一页两条数据进行切切块处理
paginator = Paginator(articles, 2)
# 获取分页中的第几页数据
page = paginator.page(page)
return render(request, 'art.html', {'page': page})
html
{% if page.has_previous %}
<a href="{% url 'art:art_list' %}?page={{ page.previous_page_number }}">上一页</a>
{% else %}
<a href="">上一页</a>
{% endif %}
{% for i in page.paginator.page_range %}
<a href="{% url 'art:art_list' %}?page={{ i }}">{{ i }}</a>
{% endfor %}
{% if page.has_next %}
<a href="{% url 'art:art_list' %}?page={{ page.next_page_number }}">下一页</a>
{% else %}
<a href="">下一页</a>
{% endif %}
<br>
第{{ page.number }}页 共{{ page.paginator.num_pages }}页
共{{ page.paginator.count }}条数据
文件上传
enctype="multipart/form-data"表单传值
一、application/x-www-form-urlencoded:
1、表单中的enctype值如果不设置,则默认是application/x-www-form-urlencoded,它会将表单中的数据变为键值对的形式
2、如果action为get,则将表单数据编码为(name1=value1&name2=value2…),然后把这个字符串加到url后面,中间用?分隔
3、如果action为post,浏览器把form数据封装到http body中,然后发送到服务器。
二、text/plain:
表单以纯文本形式进行编码
三、multipart/form-data:
1、当我们上传的含有非文本内容,即含有文件(txt、MP3等)的时候,需要将form的enctype设置为multipart/form-data。
2、将表单中的数据变成二进制数据进行上传,所以这时候这时如果用request是无法直接获取到相应表单的值的视图中获取图片:
request.FILES
模型中定义保存图片的字段:
models.ImageFiled(upload_to='art')
在settings文件中定义media文件的路径:
# 媒体文件media的配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
页面解析图片:
<img src="/media/{{ art.icon }}" alt="">
在工程目录的urls.py文件中配置解析media的路由
from django.contrib.staticfiles.urls import static
from day07.settings import MEDIA_URL, MEDIA_ROOT
# 告诉django,解析media文件夹中的静态文件
urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
网友评论