django中的form

form又称表单,在上一篇文章中有用到(html原生的form表单),没错,就是

<form action="{% url "myinclude" %}" method="post">
    <input type="text" name="user">
    <input type="text" name="password">
    <input type="submit">
    {% csrf_token %}
</form>

通过上一篇的操作,大概知道了它是前端想后端传输数据的(传输数据还有一种方式,叫做ajax,后面会拿ajax和form作比较,在这先不说了)

总结:html原生form是通过action的指向你的url去操作的,这个url就是你的name,也可以是固定的链接。

 !!!!!推荐用IE浏览器!!!!!

上面的图主要让你们看层级结构,接下来看django的form表单,它的简单使用方式:

from django.forms import Form
Django的form表单都在这个里面

首先

from django import forms

class My_Form(forms.Form):
    user = forms.CharField()
    age = forms.IntegerField()
    email = forms.EmailField()

然后在你的视图函数中写上

from django.shortcuts import render
from app1.my_form import My_Form # 引入你自己创建的form

def my_register(request):
my_forms = My_Form
return render(request,
"register.html",
{"my_forms":my_forms}
)

然后在你的app的template里面新建一个html,然后写上

<form action="/register/" method="post">
    {{ my_forms.as_p }}
{# as_p:简单理解就是标签#}
</form>

回到你app的urls里面,写上

from django.conf.urls import url
from app1 import views


urlpatterns = [
    url(r'^register/', views.my_register),
]

完毕之后,启动你的系统,输入http://127.0.0.1:8000/register/后会发现

 这三个输入框居然出来了?而你的html里面什么也没做,只是把form的变量引入过来了,那么它是怎么做到的?看下图

 然后你会发现很多奇怪的东西,不用想了!django自带的form已经帮你做了,由此可以看得出来,django的form挺好的啊!那就用它吧,但是你会问?我不想用英文,我是中国人,我就用汉字,也可以改,你在创建form的时候会发现它里面有很多东西,如下图

 对头,这里面的数据自己慢慢看,基本和django的model里的参数一样,如果想改中文,在括号里写上label=“显示名称”,如下操作

from django import forms

class My_Form(forms.Form):
    user = forms.CharField(label="用户名")
    age = forms.IntegerField(label="年龄")
    email = forms.EmailField(label="邮箱")

重启系统,再看

 于是你认为,这东西挺好,实用!emmm......算是实用吧,其实真的开发环境,你会发现他的定制性不太好,因为毕竟它是给你封装好了,你只需用,要什么效果就改什么,如果说你有一个需求,这个需求它帮不了你,这种情况下,你就要考虑扩展,也就是说,自己在html文件里面写点东西,如下

 

<form action="/register/" method="post">
<p>姓名:{{ my_forms.as_p}}</p>
<p>年龄:{{ my_forms.as_p }}</p>
<p>邮箱:{{ my_forms.as_p }}</p>
<input type="submit">
{% csrf_token %}
</form>

写完之后,你再启动系统,发现没毛病(小提示:你用谷歌或者火狐浏览器的话,你是无法提交的,因为浏览器本身帮你做了错误的处理,自己去看效果),于是你知道,这个就是基于django原来的form进行扩展的,那么接下来继续看

修改你app下的views里面的视图函数

from django.shortcuts import render
from app1.my_form import My_Form

def my_register(request):
    if request.method == "POST":
        my_forms = My_Form(request.POST)
        if my_forms.is_valid(): # is_valid可以理解为所获取的前端内容正确,它的匹配来源于你自定义form的字段
            print(my_forms.cleaned_data) # 字典格式,来源于你的前端输入的数据
    my_forms = My_Form()
    return render(request,"register.html",{"my_forms":my_forms})

然后修改你的注册页面

<form action="/register/" method="post">
    <p>姓名:{{ my_forms.user}}</p>
    <p>年龄:{{ my_forms.age }}</p>
    <p>邮箱:{{ my_forms.email }}</p>
    <input type="submit">
    {% csrf_token %}
</form>

接下来启动服务,输入链接,显示网页后输入信息

点击提交,返回后台,会发现

我们拿到数据了。当然了,视图函数里面你也可以加上else,这样的话就变成了如果正确做什么操作;如果错误做什么操作。问题来了,那么我要是输入错误了呢?他总得给我点提示吧?这个怎么实现?继续看代码

首先更改你的视图函数

from django.shortcuts import render
from app1.my_form import My_Form

def my_register(request):
    my_forms_error = ""
    if request.method == "POST":
        my_forms = My_Form(request.POST)
        if my_forms.is_valid(): # is_valid可以理解为所获取的前端内容正确,它的匹配来源于你自定义form的字段
            print(my_forms.cleaned_data) # 字典格式,来源于你的前端输入的数据
        else:
            my_forms_error = my_forms.errors
            print(my_forms_error)
    my_forms = My_Form()
    return render(request,"register.html",{"my_forms":my_forms,"my_forms_error":my_forms_error})

接下来更改你的注册页面

<form action="/register/" method="post">
    <p>姓名:{{ my_forms.user}}<span>{{ errors_obj.user.0 }}</span></p>
    <p>年龄:{{ my_forms.age }}<span>{{ errors_obj.age.0 }}</span></p>
    <p>邮箱:{{ my_forms.email }}<span>{{ errors_obj.email.0 }}</span></p>
    <input type="submit">
    {% csrf_token %}
</form>

0:代表取错误的第一个内容

然后重启你的服务,看效果吧,然后通过这种操作,就可以扩展django的form表单了

 

posted on 2018-06-19 15:56  ArkhamKnight  阅读(110)  评论(0)    收藏  举报

导航