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

本文详细介绍了如何在 Django 模型和表单中实现产品价格、唯一标题及图片格式验证,并展示了如何在模板中呈现验证后的表单,包括错误提示与 CSRF 令牌的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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 企业级应用开发实战案例 #### 创建健壮的企业级架构 为了适应复杂业务需求,在构建基于 Django 的企业级应用程序时,采用分层结构有助于提高系统的可扩展性和维护性。通常会划分成表示层、业务逻辑层以及数据访问层[^1]。 ```python # 表示层:负责渲染网页给最终用户查看 from django.shortcuts import render, redirect def index(request): context = {&#39;title&#39;: &#39;首页&#39;} return render(request, &#39;index.html&#39;, context) # 业务逻辑层:封装具体业务功能实现细节 class OrderService(): @staticmethod def place_order(user_id, product_ids): # 处理下单过程中的各种校验和计算... pass # 数据访问层:提供对持久化存储的操作接口 from .models import Product def get_product_by_id(product_id): try: return Product.objects.get(id=product_id) except Product.DoesNotExist: raise ValueError(&#39;产品不存在&#39;) ``` #### 设计高效的数据模型 针对大型企业的应用场景设计合适的数据模式至关重要。考虑到性能优化方面的需求,可以引入缓存机制来减少频繁查询带来的开销;同时利用索引来加速特定字段上的查找效率。 ```python from django.db import models class User(models.Model): username = models.CharField(max_length=50, unique=True) email = models.EmailField(unique=True) class Meta: indexes = [ models.Index(fields=[&#39;username&#39;]), models.Index(fields=[&#39;email&#39;]) ] @receiver(post_save, sender=User) def user_post_save(sender, instance=None, created=False, **kwargs): if not created: cache.delete(f"user_{instance.id}") # 清除关联用户的缓存记录 ``` #### 集成第三方服务提升用户体验 现代企业往往依赖多种外部API和服务集成到自己的平台上来增强竞争力。比如支付网关、短信通知等都可以借助成熟的SDK快速接入,并且要确保安全性措施到位防止敏感信息泄露。 ```python import requests def send_sms(phone_number, message): url = "https://api.sms.com/send" payload = { &#39;apikey&#39;: settings.SMS_API_KEY, &#39;phone&#39;: phone_number, &#39;text&#39;: message } response = requests.post(url, data=payload) if response.status_code != 200 or response.json().get(&#39;code&#39;) != &#39;OK&#39;: logger.error(f"Sms sending failed with status {response.status_code}") raise Exception("Failed to send SMS") ``` #### 构建自动化部署流水线 持续交付对于保持软件产品质量稳定非常重要。通过 GitLab CI/CD 或 Jenkins 等工具设置自动化的测试、打包发布流程能够显著降低人为错误风险并加快迭代速度。 ```yaml stages: - test - build - deploy test_app: stage: test script: - python manage.py test build_docker_image: stage: build script: - docker build -t myapp:$CI_COMMIT_REF_NAME . deploy_to_production: only: - master when: manual stage: deploy script: - ansible-playbook playbook.yml --extra-vars="env=prod" ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值