Chinaunix首页 | 论坛 | 博客
  • 博客访问: 386062
  • 博文数量: 112
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-29 13:41
文章分类

全部博文(112)

文章存档

2020年(1)

2018年(10)

2017年(27)

2016年(18)

2015年(31)

2014年(25)

分类: Python/Ruby

2017-01-19 16:50:18

1、模型类:
    model层的处理,即设计和开发信息发布的数据访问层。
    1.1、配置项目INSTALLED_APPS
           

点击(此处)折叠或打开

  1. #修改testdj/testdj/settings.py
  2. INSTALLED_APPS = [
  3.     'app.apps.AppConfig',    #增加此行,app.apps.AppConfig声明的是testdj/app/apps.py中自动生成的AppConfig类
  4.     'django.contrib.admin',
  5.     'django.contrib.auth',
  6.     'django.contrib.contenttypes',
  7.     'django.contrib.sessions',
  8.     'django.contrib.messages',
  9.     'django.contrib.staticfiles',
  10. ]
      1.2、模型定义:
     

点击(此处)折叠或打开

  1. #testdj/app/models.py添加下列代码:
  2. from django.db import models

  3. # Create your models here.
  4. '''
  5. 第一行中引入django.db.models类,所有Django模型类必须继承自它。定义了该类的子类Moment,其中定义了两个字段:
  6. 字符串类型的content用来保存消息的内容、发布人的名字、消息的类型。
  7. '''
  8. class Moment(models.Model):
  9.     content = models.CharField(max_length = 200)
  10.     user_name = models.CharField(max_length = 20)
  11.     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内容如下:
         

点击(此处)折叠或打开

  1. # -*- coding: utf-8 -*-
  2. # Generated by Django 1.10.5 on 2017-05-03 19:11
  3. from __future__ import unicode_literals

  4. from django.db import migrations, models
  5. '''
  6. 定义了Migration类,通过dependencies指定前置版本,通过operations声明对数据库进行的修改。
  7. '''

  8. class Migration(migrations.Migration):

  9.     dependencies = [
  10.         ('app', '0001_initial'),
  11.     ]

  12.     operations = [
  13.         migrations.AlterField(
  14.             model_name='moment',
  15.             name='content',
  16.             field=models.CharField(max_length=300),
  17.         ),
  18.     ]
        注: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    
 

点击(此处)折叠或打开

  1. #
  2. from django.forms import ModelForm
  3. from app.models import Moment

  4. class MomentForm(ModelForm):
  5.     class Meta:
  6.         model = Moment
  7.         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相关联。
             

点击(此处)折叠或打开

  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals

  3. from django.db import models

  4. #新增元组用于设置消息类型枚举项
  5. KIND_CHOICES = (
  6.     ('Python','Python'),
  7.     ('Mysql','Mysql'),
  8.     ('Shell','Shell'),
  9.     ('AWK','AWK'),
  10.     ('SED','SED'),
  11.     ('GREP','GREP'),
  12.     ('Other','Other'),
  13. )
  14. # Create your models here.
  15. class Moment (models.Model):
  16.     content = models.CharField(max_length = 300)
  17.     #为user_name和kind字段用default属性增加了默认值。
  18.     user_name = models.CharField(max_length = 20, default = '匿名')
  19.     #修改kind定义,加入choices参数
  20.     kind = models.CharField(max_length = 20, choices = KIND_CHOICES,
  21.                   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
             

点击(此处)折叠或打开

  1. <!DOCTYPE html>
  2. </html>
  3.     <head>
  4.         <title>消息录入页面</title>
  5.     </head>
  6.     <body>
  7.         <form action="?" method="post">
  8.             <fieldset>
  9.                 <legend>请输入并提交</legend>
  10.                     {{ form.as_p }}
  11.                     <input type="submit" value="submit" />
  12.             </fieldset>
  13.         </form>
  14.     </body>
  15. </html>
       2.4、开发视图
            

点击(此处)折叠或打开

  1. import os
  2. from app.forms import MomentForm
  3. from django.http import HttpResponseRedirect
  4. from django.core.urlresolvers import reverse
  5. from django.shortcuts import render

  6. # Create your views here.
  7. from django.http import HttpResponse

  8. def welcome(request):
  9.     return HttpResponse("

    Welcome to my home!

    "
    )

  10. def moments_input(request):
  11.     if request.method == 'POST':
  12.        form = MomentForm(request.POST)
  13.        if form.is_valid():
  14.           moment = form.save()
  15.           moment.save()
  16.           return HttpResponseRedirect(reverse("app.views.welcome"))
  17.     else:
  18.        form = MomentForm()
  19.     PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  20.     return render(request,os.path.join(PROJECT_ROOT,'app/templates',
  21. 'moments_input.html'),{'form':form})
      新增moments_input():
     如果用户的Post表单提交,则保存moment对象,并重定向到欢迎页面。
     如果是普通访问,则返回moment_input.html模板的渲染结果作为HTTP Response。
      
      增加如下字段到testdj/app/urls.py
     

点击(此处)折叠或打开

  1. from django.conf.urls import url
  2. from . import views

  3. urlpatterns = [
  4.     url(r'moments_input',views.moments_input),
  5.     url(r'', views.welcome),
  6. ]
    报错:
      
    testdj/app/templates/moments_input.html默认为ANSI,保存为UTF-8即可。

   访问页面:
     
 
访问管理界面:
   Django管理界面是一个通过简单的配置就可以实现的数据模型后台的Web控制台。
   添加下面的代码到testdj/app/admin.py
   

点击(此处)折叠或打开

  1. from django.contrib import admin
  2. from .models import Moment
  3. admin.site.register(Moment)    #通过admin.site.register()函数逐个声明要管理的模型类即可。
    初次访问管理界面,需要通过manage.py工具的createsuperuser命令建立管理员用户。
   # python manage.py createsuperuser


   访问管理界面:。
   

  
阅读(818) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~