美文网首页
Python Web框架 Django - 表单验证、路由反向解

Python Web框架 Django - 表单验证、路由反向解

作者: 莫名ypc | 来源:发表于2018-12-04 16:50 被阅读0次

表单验证

逻辑处理,创建表单验证模块里的验证类,并将用户请求的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)

相关文章

网友评论

      本文标题:Python Web框架 Django - 表单验证、路由反向解

      本文链接:https://www.haomeiwen.com/subject/jozpcqtx.html