Django学习之表单(八)
在Djangp的实际开发中,经常有一些情况需要做判断,比如表单超过边界值需要来提示,那么是实际的开发中,
需要编写js来判断这些。事实上,在Django中也提供了表单来处理这些,它的作用主要有两点,分别是:渲染模板
表单和校验表单。下来通过一些具体的案例来看这个过程,比如要增加一个作者的书籍信息,我们先按非表单的方式
来编写,编写的视图函数见如下:
from django.shortcuts import render,redirect from django.http import HttpResponse,JsonResponse,StreamingHttpResponse from django.views.decorators.http import require_http_methods from django.template import loader from django.views import View # Create your views here. from .models import * from .form import ArticleForm @require_http_methods(['GET']) def index(request): articles=Article.objects.all() return render(request,'app/index.html',locals()) def add_article(request): if request.method=='GET': return render(request, 'app/add_article.html', locals()) elif request.method=='POST': title=request.POST.get('title',None) content=request.POST.get('content',None) price=request.POST.get('price',None) Article.objects.create(title=title,content=content,price=price) return redirect(to='app:index')
在视图函数中,从后台获取到数据后,然后把数据保存到数据库中。这行代码为:Article.objects.create(title=title,content=content,price=price).
再看具体的模板文件,见源码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css"> </head> <body> <br> <div class="container"> <form action="{% url 'app:add_article' %}" method="post"> {% csrf_token %} <p> 标题:<input type="text" name="title"> </p> <p> 内容:<input type="text" name="content"> </p> <p> 价格:<input type="text" name="price"> </p> <p><input type="submit" value="提交"></p> </form> </div> </body> </html>
下来我们通过form表单的方式来进行修复,在app中新创建form.py的文件,以及数据编写每个字段,见form.py的源码:
#!/usr/bin/env python #coding:utf-8 #Author:WuYa from django import forms from django.forms import fields,ValidationError from django.forms import widgets from django.core.validators import RegexValidator from .models import * class ArticleForm(forms.Form): title=forms.CharField(max_length=100) content=forms.CharField(max_length=100) price=forms.FloatField() create_time=forms.DateTimeField()
在form.py的源码中,类继承了forms模块中的Form,这样我们可以直接在视图的函数中,可以依据form表单的
方式来,见再次修改后的视图函数,见源码:
from django.shortcuts import render,redirect from django.http import HttpResponse,JsonResponse,StreamingHttpResponse from django.views.decorators.http import require_http_methods from django.template import loader from django.views import View # Create your views here. from .models import * from .form import ArticleForm @require_http_methods(['GET']) def index(request): articles=Article.objects.all() return render(request,'app/index.html',locals()) def add_article(request): if request.method=='GET': articleForm=ArticleForm() return render(request, 'app/add_article.html', locals()) elif request.method=='POST': articleForm=ArticleForm(request.POST) if articleForm.is_valid(): data=articleForm.cleaned_data Article.objects.create(**data) return redirect(to='app:index')
在修改后的视图函数中,我们直接使用了form表单的方式,然后在判断是post请求后,进行判断,如果判断通过,
获取到前端输入的数据,然后直接添加到数据库中,见关键代码:
elif request.method=='POST': articleForm=ArticleForm(request.POST) if articleForm.is_valid(): data=articleForm.cleaned_data Article.objects.create(**data) return redirect(to='app:index')
再见模板的文件,比之前的更加简单,见具体的源码文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css"> </head> <body> <br> <div class="container"> <form action="{% url 'app:add_article' %}" method="post"> {% csrf_token %} {{ articleForm.as_p }} <p><input type="submit" value="提交"></p> </form> </div> </body> </html>
启动服务后,访问该方面,可以看到HTML的表单源码比较规范,见截图:
同时如果表单为空,点击提交,表单会返回错误的信息,见截图:
关于表单今天就先总结到这,下一节会继续对表单的知识体系进行总结。
欢迎关注微信公众号“Python自动化测试”