1、模型类:
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',
-
]
1.2、模型定义:
-
#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)
1.3、生成数据移植文件(makemigrations):
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),
-
),
-
]
注:testdj/app/migrations目录中文件全部由manage.py自己维护,开发者不要手动修改其中文件内容。
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])
模型层发生变化,需要用makemigrations和migrate命令更新数据库定义。
# 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>
2.4、开发视图
-
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})
新增moments_input():
如果用户的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()函数逐个声明要管理的模型类即可。
初次访问管理界面,需要通过manage.py工具的createsuperuser命令建立管理员用户。
# python manage.py createsuperuser
访问管理界面:。
阅读(867) | 评论(0) | 转发(0) |