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

32 篇文章 1 订阅
14 篇文章 0 订阅

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

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表单项,避免重复提交。





  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值