模型类
- 配置项目INSTALLED_APPS
新建的应用需要在settings文件中注册,即在INSTALLED_APPS中添加应用的Config类。
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app.apps.AppConfig', # 新增app应用的Config类]
- 模型定义
django模型都继承django.db.models类,一个类Moment相当于数据库表,类属性content相当于表中字段。
from __future__ import unicode_literals # 将模块中显式出现的所有字符串转为unicode类型from django.db import models# 新增元组用于设置消息类型枚举项KIND_CHOICES = (('python技术', 'python技术'),('数据库技术', '数据库技术'),('个人心情', '个人心情'),)# Create your models here.class Moment(models.Model):content = models.CharField("请输入内容", max_length=200)# 为user_name、kind增加默认值,为kind增加消息枚举项user_name = models.CharField("用户名", max_length=20, default='匿名')kind = models.CharField("选择类型", max_length=20, choices=KIND_CHOICES, default=KIND_CHOICES[0])class Meta:# 指明单数(复数)形式的对象名称,展示于djando后台verbose_name = "记录片刻"verbose_name_plural = "记录片刻"
生成数据迁移文件
- 定义完成模型,需要生成对应的数据迁移文件,命令:python manage.py makemigrations
迁移到数据库
- 迁移数据文件到数据库,命令:python manage.py migrate
视图类
- 基本视图
- 定义了模型数据,需要视图处理页面逻辑,建立路由响应函数;
下面代码定义了welcome函数,返回一条被HttpResponse()函数封装的页面信息
import osfrom django.shortcuts import renderfrom django.http import HttpResponse# Create your tests here.def welcome(request):return HttpResponse("<h1>Welcome to my site</h1>")
- 表单类
- 新建forms.py文件,引入django.forms.ModelForm类
- 定义子类Meta,用于声明与本表单关联的模型及其字段 ```python from django.forms import ModelForm from .models import Moment
class MomentFrom(ModelForm): class Meta: model = Moment fields = “all“
3. 表单视图1. 常见视图中有表单视图,使表单类和页面模板关联,提供用户输入表单等内容的处理逻辑(保存到数据库中)1. 代码新增moments_input函数,定义了普通访问和post提交表单的处理逻辑,普通访问则返回moments_input.html的渲染,post提交则保存再重定向到first_url页面1. 普通访问render需要传入三个参数:request默认必传参数,页面模板文件路径,form作为参数传入模板,才能访问到MomentFrom实例。```pythonimport osfrom django.shortcuts import renderfrom django.http import HttpResponsefrom django.http import HttpResponseRedirectfrom django.urls import reversefrom .forms import MomentFromdef moments_input(request):if request.method == 'POST':form = MomentFrom(request.POST)if form.is_valid():moment = form.save()moment.save()return HttpResponseRedirect(reverse('first_url'))else:form = MomentFrom()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})
页面模板
页面模板文件
主路由
- 项目目录下urls.py文件下,增加对应用app中路由的引用,通过django.con.urls 引入include(),通过include()函数将两个urlpatterns关联。 ```python from django.contrib import admin from django.urls import path from django.conf.urls import url, include
urlpatterns = [ path(‘admin/‘, admin.site.urls), url(r’^app’, include(‘app.urls’)), # 新增app一级路由 ]
2. 应用路由1. 在应用目录下新建urls.py文件,管理app所有url映射。1. url(regex, view, kwargs, name)1. 其中regex表示用正则表达式表达url路由1. view表示路由映射到的视图中的对应函数1. name表示该映射的命名```pythonfrom django.conf.urls import urlfrom . import viewsfrom django.views.decorators.csrf import csrf_exempturlpatterns = [url(r'^$', views.welcome, name='first_url'),url(r'moments_input', csrf_exempt(views.moments_input)),]

