有了解或者做过web开发的应该都对表单不陌生,就是HTML中的form,对form的处理流程相信大家也有数,这里就不再多说。
表单视图是偏向于与用户直接交互的,
首先在一个工程中的app中建立一个forms.py,
#定义表单类
from django.forms import ModelForm
from app.models import Moment
class MomentForm(ModelForm):
class Meta:
model=Moment
fields='__all__'
'''第一行引入的是django中表单类的基类ModelForm,
第二行引入的是本app(app的名字叫app)models.py文件中的Moment类
在表单类MomentForm中定义子类Meta,在Meta中声明与本表单关联的模型类及其字段
fields可以是'__all__',也可以是相应模型类的某些字段如:
fields=('content','username','kind')
'''
当然这是非常的简单的表单,实际中我们可以想到一些其他功能的表单怎么做呢,比如有下拉框的:
#引入这个一定要在第一行引入
from __future__ import unicode_literals
from django.db import models
Kind_Choices=(
('1','Python教程'),
('2','HTML教程'),
('3','Django教程'),
('4','个人心情'),#最后一逗号别忘了
)
class Moment(models.Model):
content=models.CharField(max_length=100)
username=models.CharField(max_length=20,default='匿名')
kind=models.CharField(max_length=20,choices=Kind_Choices,default=Kind_Choices[0])
"""
很明显的,如果我们想要让表单显示的是下拉框,我们需要改动的是models.py文件的内容而不是
在froms.py中进行改动,然后我们进行这样改动之后,显示给用户的页面中kind输入框就会变成下拉框
的形式
"""
'''
我们来捋捋思路啊,首先我们这个表单是需要依附在某个(某几个有关系的models)的数据之上的,
比如我们要录入成绩,我们需要在一个表单上对好几个models类的某几个字段进行编辑然后再插入
(我们成绩肯定有对应的哪一科,对应的哪个人吧,这些在关系数据库中都有相应的关系),然后
确定需求之后我们就要对相对应的models类进行修改,这些models类后面都会映射到数据库中
数据表中,我们定义的Kind_Choices是不是有点类似那个字段的取值范围
'''
既然已经定义了表单了,模型类也进行了修改(这时候你得先用makemigrations和migrate将修改同步一下),怎么在模板中用上这个表单呢(这里的表单就是动态的内容,而不是写死在模板中的)?
<!DOCTYPE html>
<html>
<head>
<title>录入界面</title>
</head>
<body>
<form action="?" method="post">
<fieldset>
<legend>请输入并且提交</legend>
{{form.as_p}}
<input type="submit" value="提交" />
</fieldset>
</form>
</body>
</html>
<!--在中间我们用了{{这里面是变量}},这是一种特殊的格式,记住就行了,还有一种是{% 这里面是一些语句如if,for%}, -->
在模板中也写好了,那vies中肯定也不能落下啊,不然怎么回应用户的请求啊:
import os
from app.forms import MomentForm
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
def moments_input(request):
if request.method=='POST':
form=MomentForm(request.POST)
if form.is_valid():
moment=form.save()
moment.save()
return HttpResponseRedirect(reverse('first-url')
else:
form=MomentForm()
PROJECT_ROOT=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
return render(request,os.path.join(PROJECT_ROOT,'app/templates','moments_input.html'),
{'form':form})
'''
解释一下流程,我们请求大多是POST或者GET,如果用的是post就说明是提交了数据到后台来,我们
先把request.POST这次请求的对象进行转换成MomentForm然后赋给form,对form的值进行合法性检验,
然后将这次提交到后台来的数据保存,然后重定向到urls.py文件中名字为first-url的页面,
如果不是提交数据,则返回表单,(注意传到前端的数据要用字典进行封装)。
'''