model层的处理,即设计和开发信息发布的数据访问层。
1.1、配置项目INSTALLED_APPS
点击(此处)折叠或打开
- #修改testdj/testdj/settings.py
- INSTALLED_APPS = [
- 'app.apps.AppConfig', #增加此行,app.apps.AppConfig声明的是testdj/app/apps.py中自动生成的AppConfig类。
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- ]
点击(此处)折叠或打开
- #testdj/app/models.py添加下列代码:
- from django.db import models
- # Create your models here.
- '''
- 第一行中引入django.db.models类,所有Django模型类必须继承自它。定义了该类的子类Moment,其中定义了两个字段:
- 字符串类型的content用来保存消息的内容、发布人的名字、消息的类型。
- '''
- class Moment(models.Model):
- content = models.CharField(max_length = 200)
- user_name = models.CharField(max_length = 20)
- kind = models.CharField(max_length = 20)
Django的术语“生成数据移植文件”是指将models.py中定义的数据表转换成数据库生成脚本的过程。
#cd testdj
# python manage.py makemigrations app
通过输出可以看到完成了模型Moment的建立。输出的0001_initial.py是数据库生成的中间文件,通过它可以知道当前数据库的版本;该文件及以后的所有migration文件都存在于目录testdj/app/migrations/中。
在makemigrations的过程中,Django会对比models.py中的模型与已有数据库之间的差异,如没有差异则不会做任何工作:
修改models.py中Moment类的content字段长度200为300后,再次执行makemigrations:
app/migrations/0002_auto_20170503_1911.py内容如下:
点击(此处)折叠或打开
- # -*- coding: utf-8 -*-
- # Generated by Django 1.10.5 on 2017-05-03 19:11
- from __future__ import unicode_literals
- from django.db import migrations, models
- '''
- 定义了Migration类,通过dependencies指定前置版本,通过operations声明对数据库进行的修改。
- '''
- class Migration(migrations.Migration):
- dependencies = [
- ('app', '0001_initial'),
- ]
- operations = [
- migrations.AlterField(
- model_name='moment',
- name='content',
- field=models.CharField(max_length=300),
- ),
- ]
1.4、移植到数据库:
将移植文件生效、修改真实的数据库schema时,需要通过manage.py的migrate命令使修改同步到数据库中。
# python manage.py migrate
每次修改models.py文件内容后运行makemigrations命令,检查改动是否符合数据库的语法规则;在调试运行之前,运行一次migrate命令使改动生效。
2、 表单视图
设计和开发信息录入页面。该页面提供基本功能为:提供输入界面,用户输入名字、文本消息内容、选择消息类型,用户提交后网页自动设置该信息的时间并保存到数据库。
2.1、 定义表单类:
新建文件testdj/app/forms.py
点击(此处)折叠或打开
- #
- from django.forms import ModelForm
- from app.models import Moment
- class MomentForm(ModelForm):
- class Meta:
- model = Moment
- fields = '__all__' #将所有模型类中的字段导入表单类中。
引入django.forms.ModelForm类,该类是所用Django表单类的基类。
引入在本应用models.py中定义的Moment类,以便在后面的表单类中关联Moment类。
定义表单类MomentForm,在其中定义子类Meta。在Meta中声明与本表单关联的模型类及其字段。
Fields字段可以设为__all__,也可以用列表形式声明所要导入的属性,例:fields=('content','user_name','kind')。
2.2、修改模型类
为了使用户能够以单选的方式设置消息类型,需要在models.py文件中定义单选枚举值,并与模型类Moment相关联。
点击(此处)折叠或打开
- # -*- coding: utf-8 -*-
- from __future__ import unicode_literals
- from django.db import models
- #新增元组用于设置消息类型枚举项
- KIND_CHOICES = (
- ('Python','Python'),
- ('Mysql','Mysql'),
- ('Shell','Shell'),
- ('AWK','AWK'),
- ('SED','SED'),
- ('GREP','GREP'),
- ('Other','Other'),
- )
- # Create your models here.
- class Moment (models.Model):
- content = models.CharField(max_length = 300)
- #为user_name和kind字段用default属性增加了默认值。
- user_name = models.CharField(max_length = 20, default = '匿名')
- #修改kind定义,加入choices参数
- kind = models.CharField(max_length = 20, choices = KIND_CHOICES,
- default = KIND_CHOICES[0])
# python manage.py makemigrations app
# python manage.py migrate
2.3、开发模板文件
模板是Python Web框架中用于产生HTML、XML等文本格式文档的术语。
创建目录testdj/app/templates,在其中新建模板文件moments_input.html
点击(此处)折叠或打开
- <!DOCTYPE html>
- </html>
- <head>
- <title>消息录入页面</title>
- </head>
- <body>
- <form action="?" method="post">
- <fieldset>
- <legend>请输入并提交</legend>
- {{ form.as_p }}
- <input type="submit" value="submit" />
- </fieldset>
- </form>
- </body>
- </html>
点击(此处)折叠或打开
- import os
- from app.forms import MomentForm
- from django.http import HttpResponseRedirect
- from django.core.urlresolvers import reverse
- from django.shortcuts import render
- # Create your views here.
- from django.http import HttpResponse
- def welcome(request):
- return HttpResponse("
Welcome to my home!
") - def moments_input(request):
- if request.method == 'POST':
- form = MomentForm(request.POST)
- if form.is_valid():
- moment = form.save()
- moment.save()
- return HttpResponseRedirect(reverse("app.views.welcome"))
- 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表单提交,则保存moment对象,并重定向到欢迎页面。
如果是普通访问,则返回moment_input.html模板的渲染结果作为HTTP Response。
增加如下字段到testdj/app/urls.py
点击(此处)折叠或打开
- from django.conf.urls import url
- from . import views
- urlpatterns = [
- url(r'moments_input',views.moments_input),
- url(r'', views.welcome),
- ]
testdj/app/templates/moments_input.html默认为ANSI,保存为UTF-8即可。
访问页面:
访问管理界面:
Django管理界面是一个通过简单的配置就可以实现的数据模型后台的Web控制台。
添加下面的代码到testdj/app/admin.py
点击(此处)折叠或打开
- from django.contrib import admin
- from .models import Moment
- admin.site.register(Moment) #通过admin.site.register()函数逐个声明要管理的模型类即可。
# python manage.py createsuperuser
访问管理界面:http://192.168.10.46:8001/admin。