模型类
- 配置项目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 os
from django.shortcuts import render
from 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实例。
```python
import os
from django.shortcuts import render
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.urls import reverse
from .forms import MomentFrom
def 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表示该映射的命名
```python
from django.conf.urls import url
from . import views
from django.views.decorators.csrf import csrf_exempt
urlpatterns = [
url(r'^$', views.welcome, name='first_url'),
url(r'moments_input', csrf_exempt(views.moments_input)),
]