这次我们从一个表单的例子引入Django的大致开发过程.其中主要涉及到表单与数据库之间的数据存取.
目录结构
上一篇我们实现了Django项目的新建,现在来看看它的目录结构:
- projectname/ (项目的主目录)
- projectname/ (主要配置文件的存放地址)
- __init__.py (来将该文件夹视为一个包)
- setting.py (全局配置)
- urls.py (Django主要的urls配置入口)
- wsgi.py (Django启动的wsgi文件,暂时不管)
- templates/ (主要的html文件模板)
- manage.py (启动Django的主要文件)
除了这些文件夹之外,还有一些常用的文件夹需要手动创建:
- app\ (各种独立出来的app应用)
- static\ (存放静态文件,即css js 或者主要的图片)
- log\ (存放运行日志)
- media\ (一般用来存放用户上传的文件)
ps: 若以后app多了,全部放在项目的根目录会比较乱,可以再创建一个apps文件夹来存放各个app(记得在里面放上一个__init__.py文件)
注意,如果是用Django自带的命令创建的项目,则不会自带templates文件夹,所以即使手动创建了也需要配置一下,static文件夹也是需要进行配置.
打开settings.py文件,找到TEMPLATES,为一个list,里面放着一个dic,而其中的’DIRS’段即为自定义模板的保存位置,修改为:
'DIRS': [os.path.join(BASE_DIR, 'templates')],
可见其实’BASE_DIR’是该文件定义好了的项目根目录位置.
然后是static文件夹,在settings.py文件最后补上:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
即可指引到根目录下创建好的那个static文件夹.
创建app
利用Pycharm可以很方便的创建app.依次点击菜单栏上的 Tools->Run manage.py Task… 然后在打开的窗口下输入start appname
即可创建指定名称的app.
若是没有使用Pycharm的用户,则可以通过cmd,在manage.py的同目录下,输入:
python manage.py startapp appname
这里我们的例子是个表单,就创建一个名为Form的app,创建好后可以看到app的目录结构如下:
- Form/
- migrations/
- __init__.py
- __init__.py
- admin.py
- apps.py
- models.py
- tests.py
- views.py
创建完app后记得在setting.py里注册一下.在INSTALLED_APPS这个list里补上’message’,不然该项目不会识别这个app,不方便后面更新数据库.
创建表单页面
这里简单编写一个html表单页面,然后简单配置一下css文件检验下效果.新建一个form.html文件,内容如下:
<!DOCTYPE html>
<html>
<head>
<title>form test</title>
</head>
<form action="" method="post">
<table align="center">
<caption>Test Form</caption>
<tr>
<td>name:</td>
<td><input type="text" name="name" /></td>
</tr>
<tr>
<td>password:</td>
<td><input type="text" name="password" /></td>
</tr>
<tr>
<td>email:</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Submit" />
</td>
</tr>
</table>
</form>
</html>
然后是style.css文件(简单的配置下表单):
form {
border:1px solid #000;
border-radius: 5px;
margin: 0 auto;
max-width: 300px;
}
然后将form.html文件放到templates文件夹中,style.css文件放到static\css文件夹中(css文件夹新建,用一个文件夹保存同个类型的文件比较方便).然后在form.html中添加对style.css文件的引用,在<head>里添加:
<link rel="stylesheet" href="\static\css\style.css">
记住路径一定是’\‘开头
配置该页面
要绑定这个html文件,就需要进urls.py文件里绑定与之对应的url规则.而一个url规则需要对应一个view方法,在对应app里定义.
现在新增一个view方法,在message这个app里的views.py里新增以下代码:
def getForm(request):
return render(request, 'form.html')
这就创建好了一个view方法,他的第一个默认参数是一个WSGIRequest对象,即一个对应的网页请求,这里直接返回原先定义的那个html文件,使用render()方法.
接下来填写urls.py,新增一个url绑定,在urls.py文件的urlpatterns列表里新增:
url(r'^form/$', views.getForm, name='getForm'),
文件开头要记得import一下message的views文件
url的填写顺序: 1.一段正则表达式用来匹配输入的url(‘^’表示从这里开始,’/$’表示从这里结束);2.对应的view方法;3.可以给该url指定一个名称(可选但最好带上)
这里新增了url后,原先默认的起始页就404了
现在启动django项目,地址输入 http://127.0.0.1:8000/form
,正常的话可以看到原先建立的表单页面了.
可见css文件有正常导入
创建model
既然是表单,就涉及到数据的存取,也就涉及到数据库的操作.在开发环境搭建那一篇文章里装过mysql的驱动,这里就不用装了.
有了数据库就得创建model模型,这就涉及到django的orm模型.
这里提一下一般的数据库操作流程:
def book_list(): db = mysqldb.connect(user='', db='', passwd='', host='') cursor = db.cursor() cursor.excute('SELECT name FROM books ORDER BY name') names = [row[0] for row in cursor.fetchall()] db.close()
即连接数据库->创建cursor->执行sql语句->取回值, 而orm则是将数据库的表结构映射为一个类来操作,以类的方式来完成这些繁琐的工作.
现在来创建对应的model模型,在message的models.py文件里新增以下代码:
class User(models.Model):
name = models.CharField(max_length=10, verbose_name='用户名')
password = models.CharField(max_length=50, verbose_name='密码')
email = models.EmailField(verbose_name='邮箱')
class Meta:
verbose_name = '用户信息'
这里新增了一个User类用来定义与操作对应的数据,按照原先定义的表单的内容这里定义了name, password, email三个变量,其中按他们应有的类型选用了不同的模型字段(Field).
(这里是官方各种字段(Field)类型的文档.)
CharField顾名思义为字符串字段,name与password都属于这一类,注意该字段有个必填的属性为max_length,而verbose_name为对该变量的注释;而email也有专门的字段EmailField.定义完一个model类后要定义一个Meta信息,其中为对该类型(User)的注释定义
现在运行命令 makemigrations message
(在Tools->Run manage.py Task…里)生成数据库更新记录,如果没问题就再输入 migrate message
.可以用navicat看表是否创建成功.
生成表的默认命名结构为: appname_modelname (全为小写)
数据表的增删改查
最后让表单可以与数据库进行数据存取.在views.py中导入models.py文件,然后就可以在view方法中对该数据表进行实例化.
例如:
all = User.objects.all()
这里的’objects’为一个默认的数据表管理器,它的’all()’方法会返回全部的数据,且可迭代.得到的实例,可以使用类似item.name的方法来取得数据.
‘objects’还有个方法’filter()’可用来筛选数据.
使用方法:pp = User.objects.filter(name='pp')
而存储数据可以通过创建一个User对象并赋上各个值,最后调用’save()’方法进行保存.删除数据则通过’delete()’方法.
现在要让html页面可以提交数据,必须在html文件里写上 {% csrf_token %}
,不然django不会让他提交,这是一种安全机制.
而表单的 action
属性则需要填上要提交的url,这里还是form.html自己,而先前我们给它定义了一个名称为 ‘getForm’ ,所以这里我们可以填为:
<form action="{% url 'getForm' %}" method="post">
这样以后我们修改form的url规则的话,就不用连同html文件内部一起修改了.
现在我们修改下getForm这个view方法,实现提交后数据可以保存到数据库:
def getForm(request):
if request.method == 'POST':
name = request.POST.get('name', '')
password = request.POST.get('password', '')
email = request.POST.get('email', '')
user = User()
user.name = name
user.password = password
user.email = email
user.save()
return render(request, 'test.html)
这里用
request.method
来判断进来的是post请求还是get请求(默认为get请求,当表单提交的时候是post请求),post时该request对象带有一个POST属性,此为一个dict,包含着填入的数据.用相应的get方法取得数据并赋值给新建的User对象并save一下就行了.
可以试试填入数据并提交然后用navicat来检查是否已经保存进数据库.