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的表单源码比较规范,见截图:

同时如果表单为空,点击提交,表单会返回错误的信息,见截图:

 

     关于表单今天就先总结到这,下一节会继续对表单的知识体系进行总结。

posted @ 2019-01-23 17:21  无涯(WuYa)  阅读(151)  评论(0编辑  收藏  举报