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) 收藏 举报
浙公网安备 33010602011771号