Django实战(9):实现Product的输入校验

让我们完成上一节中的任务:

1.验证price>0:需要在Form中验证;
2. 验证title唯一:在Model中验证;
3. 验证image_url的扩展名:在Form中验证,还可以顺便在Model中将其改为URLField类型。

之前生成的scaffold中已经实现了属性不能为空的验证:

但是对于url格式,rul的后缀,title的唯一性都没有验证。首先在model中增加URL格式和title唯一性的校验:

from django.db import models

class Product(models.Model):
	title = models.CharField(max_length=100,unique=True)
	description	= models.TextField()
	image_url = models.URLField(max_length=200)
	price = models.DecimalField(max_digits=8,decimal_places=2)
	

在title上增加unique=True, 并将image_url的类型改为URLField,就完成了:

剩下的图片格式后缀、价格>0的校验需要在form中实现:

depot/depotapp/forms.py

#/usr/bin/python 
#coding: utf8

from django import forms
from models import *
import itertools

def anyTrue(predicate, sequence):
    return True in itertools.imap(predicate, sequence)
def endsWith(s, *endings):
    return anyTrue(s.endswith, endings)

class ProductForm(forms.ModelForm):
    
    class Meta:
        model = Product    

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)

    def clean_price(self):
        price = self.cleaned_data['price']
        if price<=0:
            raise forms.ValidationError("价格必须大于零")
        return price
    def clean_image_url(self):
		url = self.cleaned_data['image_url']
		if not endsWith(url, '.jpg', '.png', '.gif'):
			raise forms.ValidationError('图片格式必须为jpg、png或gif')
		return url
	
 
ProductForm继承自ModelForm,可以根据model属性自动生成表单。

在生成的ProductForm上增加了clean_price和clean_image_url验证。结果如下:

那么,表单是如何展现的呢?看一下template:

depot/depotapp/templates/depotapp/create_product.html

{% extends "base.html" %}

{% block title %} 创建产品 {% endblock %}

{% block content %} 
<table>
<form action="" method="POST"> {% csrf_token %}
  {{form}}
  <tr>
    <td colspan="2" align="right"><input type="submit" value="Create"/></td>
  </tr>
</form>
</table>
{% endblock %}

直接输出form对象({{fom}} 就会将Form格式化成表单(默认使用table,也可以通过as_p,as_ul方法指定为<p>或<li>),并且包含了错误提示信息。

{% csrf_token %}的作用是增加token表单项,避免重复提交。





更多相关推荐

Django实战(4):scaffold生成...

在上一节用一个插件生成了类似rails的scaffold,其实无非就是URLconf+MTV。让我们看看具体都生...

继续阅读

Django2.0 js脚本实现AJAX POST...

新建django-ajax-post.js文件在html页面中直接导入导入后可在页面中直接使用post方式提交

继续阅读

Django实战008:基于Token的验证...

什么是TokenToken字面意思是令牌,功能跟Session类似,也是用于验证用户信息的,Token是服务端...

继续阅读

python简易实现的 csrf防护

上一篇讲的是用flask-wtf这个库实现csrf防护https://blog.csdn.net/he93007/article/details/7...

继续阅读

Django:csrf防御机制

{%csrf_token%}标签,csrf全称是CrossSiteRequestForgery。是Django提供的防止伪装提交请求的...

继续阅读

详解Django的CSRF认证实现

什么是CSRFCSRF,CrossSiteRequestForgery,跨站点伪造请求。举例来讲,某个恶意的网站上有一个...

继续阅读

Django的csrf中间件

Django的csrf中间件CSRF的攻击流程用户a访问可信站点1做业务处理,此时浏览器会保存该网站的co...

继续阅读

Django实战(20):分页(Pagina...

在上一节我们实现了针对某个产品的订单订阅功能。但是我们可能需要直接在站点上查询所有的订单...

继续阅读

django csrf 403

在表单中加入了{%csrf_token%},还是报403,最后由张丹同学发现是因为表单里面有

继续阅读

Django POST时错误提示:CSRF验...

出现这种问题有两种方法可以解决:1.在我们的站点文件中的setting.py里面的MIDDLEWARE下面的一...

继续阅读