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表單項,避免重復提交防止跨站偽造請求攻擊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM