Django入门

一、开发流程

1、在github上新建工程

clone or download复制路径
在这里插入图片描述
2、复制远程仓库内容

新建文件夹,右键选择Git Bash Here
输入git clone 路径名
在这里插入图片描述
3、创建python项目

cd进入.git同级目录下创建python项目(需要在虚拟环境下创建)
workon 虚拟环境名,进入虚拟环境
django-admin startproject 项目名称
在这里插入图片描述
4、创建应用

在pycharm中打开项目
在manage.py同级目录下打开终端
输入python manage.py startapp 应用名
在这里插入图片描述
将应用添加到settings.py中,goods是创建的应用名

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'goods',
]

5、创建模型

(1)在应用中的model.py文件中创建类,需继承models.Model类

class User(models.Model):
    uname = models.CharField(max_length=20)

    def __str__(self):
        return self.uname


class Good(models.Model):
    gname = models.CharField(max_length=20)
    gprice = models.FloatField()
    guser = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.gname

(2)生成迁移文件
在manage.py同级打开终端
输入python manage.py makemigrations
在这里插入图片描述

(3)执行迁移
输入python manage.py migrate
在这里插入图片描述
(4)打开可视化工具Navicat查看数据表
连接SQLite,连接名随意,数据库文件选择项目中生成的db.sqlite3文件,连接成功可看到生成的数据表
在这里插入图片描述
(5)启用shell命令
在manage.py同级目录下打开终端,输入python manage.py shell实现对数据表的增删改查
在这里插入图片描述

# 首先导入models中的类
from goods.models import *
# 创建实例
g1 = Goods()
# 赋值
g1.gname = "苹果"
g1.gprice = 9 
# 保存
g1.save()
# 删除
g1.delete()

# 查看第一个商品的名字
# Goods.objects.all()返回一个查询集QuerySet,是一个可迭代类型
Goods.object.all()[0].gname

6、创建超级管理员

(1)在manage.py同级目录下打开终端
输入python manage.py createsuperuser
在这里插入图片描述
(2)向admin注册goods应用的模型
在应用中的admin.py中加入以下代码

from .models import *

admin.site.register(Goods)
admin.site.register(User)

(3)启动服务端测试
在manage.py同级目录下打开终端
输入python manage.py runserver
在这里插入图片描述
(5)浏览器输入http://127.0.0.1:8000/admin/查看后台管理
在这里插入图片描述
7、编辑语言时区

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/shanghai'

8、自定义管理页面

(1)在admin.py中定义模型的显示方式和关联注册

from django.contrib import admin
from .models import *
# Register your models here.


class GoodInline(admin.StackedInline):
    """实现关联注册"""
    model = Good
    # 关联个数
    extra = 1


class GoodAdmin(admin.ModelAdmin):
    """自定义管理界面"""
    # 显示字段
    list_display = ["id", "gname", "gprice", "guser"]
    # 过滤字段
    list_filter = ["gname"]
    # 搜索字段
    search_fields = ["gname"]


class UserAdmin(admin.ModelAdmin):
    list_display = ["id", "uname"]
    inlines = [GoodInline]


admin.site.register(Good, GoodAdmin)
admin.site.register(User, UserAdmin)

(2)更改列名
例如将gname改为商品名
需要在model.py的Good类中定义函数

    def name(self):
        return self.gname
    name.short_description = "商品名"

然后在admin.py的GoodAdmin中修改显示字段

list_display = ["id", "name", "gprice", "guser"]

在这里插入图片描述
9、创建视图

(1)在项目的urls.py中添加代码

from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url('goods/', include('goods.urls')),
]

(2)在views.py中添加视图函数

from django.http import HttpResponse


# Create your views here.
def index(request):
    return HttpResponse("首页")

(3)在应用中新建urls.py文件,添加代码

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

urlpatterns = [
    url(r'^$', views.index),
    url(r'^list/$', views.list),
]

10、创建模板

(1)在网站根目录创建templates文件夹

(2)修改settings.py文件,设置TEMPLATES列表中的’DIRS’: []

'DIRS': [os.path.join(BASE_DIR, 'templates')]

(3)在templates中新建index.html模板

<body>
	<h1>首页</h1>
   <a href="/list/">列表页</a>
</body>

(4)在views.py使用模板

def index(request):
    return render(request, 'good/index.html', {})
 
 def list(request):
 	return render(request, 'good/list.html')

(5)去除模板的硬编码
以防url中的地址发生改变时,由首页跳转到列表页失败

#1 给应用添加命名空间
app_name = "goods”

#2 在项目的urls.py中指定应用的命名空间
 url('goods/', include('goods.urls', namespace='goods')),
 
 #3 在应用的urls.py中添加url别名
url(r'^$', views.index, name="index"),
  url(r'^list/$', views.list, name="list"),
  
#4 去除模板硬编码
 <a href="{% url 'goods:list' %}">列表页</a>

11、管理静态文件

项目中的CSS、图片、JS都是静态文件
(1)配置静态文件,在settings.py中定义静态内容

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

(2)在项目根目录下创建static目录,再创建存放静态文件的文件夹

static/imgs

(3)在模板中使用静态文件

<img src = '/static/imgs/01.png'>

二、Model

1、ORM(对象—关系—映射),主要任务是:
#&8395;根据对象的类型生成表结构
#&8395;将对象、列表的操作,转换成sql语句
#&8395;将sql查询到的结果转换为对象、列表

优点:摆脱复杂的SQL操作,使用快速开发;让数据结构变得简介;数据库迁移成本更低。

2、使用mysql数据库
首先安装Mysql数据库

pip install pymysql

在项目的__init__.py中添加代码

import  pymysql
pymysql.install_as_MySQLdb()

使用Mysql数据库需要自己在终端先创建数据库,django不能创建

create database demo1 charset=utf8

在settings.py中配置数据库

DATABASES = {
	‘default’: {
		'ENGINE': 'django.db.backends.mysql',
		‘NAME’ : 'demo1',
		'USER' : 'admin',
		'PASSWORD' : '123456',
		'HOST': '127.0.0.1' # localhost
		'PORT' : '3306', 
		}
	}

3、定义模型
(1)在模型中定义属性,会生成表中的字段,django会为表增加自动增长的主键列,每个模型只能有一个主键列。属性命名不能是python的保留关键字,不允许使用连续的下划线。

(2)定义属性时,需要字段类型(form django.db import models)

(3)字段类型
 AutoFiled:一个根据实际Id自动增长的IntegerField,通常不指定,若不指定,一个主键字段将自动添加到模型中。
 BooleanField:默认表单控件是CheckboxInput。
 NullBoolField:支持null、true、false三种值。
 CharField(max_length=字符长度):字符串,默认表单控件是TextInPut。
 TextField:大文本字段,一般超过400使用,默认表单控件是Textarea。
 IntegerField:整数。
 FloatField:浮点数。
 DateField([auto_now=False, auto_now_add=False]):使用python的datetime.date实例表示的日期
  参数DateField.auto_now: 每次保存对象时, 自动设置该字段为当前时间, 用于"最后一次修改"的时间戳, 它总是使用当前日期, 默认为false
  参数DateField.auto_now_add: 当对象第一次被创建时自动设置当前时间, 用于创建的时间戳, 它总是使用当前日期, 默认为false
  该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件, 和一个“Today"的快捷按钮, 包含了一个额外的invalid_date错误消息键
  auto_now_add, auto_now, and default 这些设置是相互排斥的, 他们之间的任何组合将会发生错误的结果
 TimeField:使用python的datetime.time实例表示的时间,参数同DateField
 DateTimeField:使用python的datetime.datetime实例表示的日期和时间,参数如DateField
 FileField:一个上传文件的字段
 ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保是image,使用需要先安装pillow

(4)字段选项
 通过字段选项,可以实现对字段的的约束,在字段对象时通过关键字参数指定
 null:如果是True,Django将空值以NULL存储到数据库中,默认是False
 blank:如果是True,则该字段允许为空白,默认值是False,用在表单验证中
 db_column:字段的名称,如果未指定,则使用属性的名称
 db_index:若值为True,则在表中为此字段创建索引
 default:默认值
 primary_key:若为True,则该字段为模型的主键字段
 unique:若为True,则该字段在表中必须有唯一值
 help_text:会在form表单控件中显示help文本

4、关系
(1)ForeignKey:一对多,将字段定义在多的端中
一访问多:对象.模型类小写_set
(2)OneToOneField:一对一,将字段定义在任意一端中
一访问一:对象.模型类小写
(3)ManyToManyField:多对多,将字段定义在两端中
多访问多:对象.属性_id

5、元选项
在模型类中定义类Meta,用于设置元信息

class Student(models.Model):
	name = models.CharField(max_length=20)
	age = models.IntegerField()
	class Meta():
	db_table = 'student'
	# ordering是对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表
	# 字符串前加—表示倒序,不加表示正序
	ordering = ['age','-name']

6、管理器Manager
管理器是Django的模型进行数据库的查询操作的接口,用于与数据库进行交互,Django应用的每个模型都拥有至少一个管理器,当定义模型类时没有指定管理器,Django会为模型类提供一个名为objects的管理器。
当创建对象时,django不会对数据库进行读写操作,当调用save()方法才与数据库交互,将对象保存到数据库中,使用关键字参数构造模型对象很麻烦,下面是创建对象的方法:
(1)在模型类中增加一个类方法

class Goods(models.Model):
	name = models.CharField(max_length=20)
	# 自定义过models.Manager()之后不再具有Goods.objects对象
	# gdmanager = models.Manager()
	@classmethod
	def create(cls,name):
	goods = cls(name = name)
	return goods

# 添加一个Goods
Goods.create('e').save()

(2)自定义管理器,内部使用self.model()获取模型

class GoodsManage(models.Manager):
	def create_book(self,name):
	goods = self.model()
	goods.name = name
	return goods
class Goods(models.Model):
	name = models.CharField(max_length=20)
	# 方式二
	gdmanager = GoodsManage()
	
# 添加一个Goods
Goods.gdmanager.create('e').save()

(3)可以在管理类中调用self.create,可以不使用save()

class GoodsManage(models.Manager):
	def create_book(self,name):
		goods = self.create(name=name)
		return goods
class Goods(models.Model):
	name = models.CharField(max_length=20)
	# 方式三
	gdmanager = GoodsManage()

7、模型查询
查询集表示从数据库中获取的对象集合,查询集是可迭代的对象。返回查询集的方法称为过滤器,过滤器基于所给的参数限制查询的结果。查询集可以含有0个、1个或多个过滤器。

 all():检索所有的对象
 filter(**kwargs):检索特定的对象,返回一个与参数匹配的QuerySet
 exclude():返回一个与参数不匹配的QuerySet
 order_by(column_name):检索排序后的对象,默认升序,列名前加—表示降序
 get():返回单个满足条件的对象,如果未找到会引发异常
 count():返回当前查询的总条数
 first():返回第一个对象
 last():返回最后一个对象
 exists():判断查询集中是否有数据,如果有则返回True

8、比较运算符
exact:表示判等,大小写敏感

filter(isDelte=False)

continue:是否包含,大小写敏感

exclude(btitle_contains='传')

startswith、endswith:以value开头或结尾,大小写敏感

exclude(btitle_endswith='传')

isnull、isnotnull:是否为null

filter(btitle_isnull=False)

iexact:在运算符前面加i表示不区分大小写
in:是否包含在范围内

fliter(pk__in=[1, 2, 3, 4, 5])

gt、gte、lt、lte:大于、大于等于、小于、小于等于

filter(id__gt=3)

year、month、day、week_day、hour、minute、second:日期类型

filter(bpub_date__year=1980)
filter(bpub_date_gt=date(1980, 12, 31))

pk:表示主键,默认的主键是id

filter(pk__lt=6)

9、聚合函数
Avg、Count、Max、Min、Sum

from django.db.models import Max
maxDate = BookInfo.books.all().aggregate(Max('bpub_date'))

10、F对象
F()允许Django在未实际连接数据的情况下具有对数据库字段的值的引用。
通常情况下我们在更新数据时需要先从数据库里将原始数据取出后放在内存里,然后编辑某些属性,最后提交。

book = BookInfo.books.get(pk=3)
print(book.bpub_date)
delta = timedelta(days=3)
book.bpub_date = book.bpub_date + delta
book.save()
book = BookInfo.books.get(pk=3)
print(book.bpub_date)

当我们使用了F()之后:

from django.db.models import F

book = BookInfo.books.get(pk=3)
print(book.bpub_date)
delta = timedelta(days=3)
book.bpub_date = F('bpub_date') + delta
book.save()
book = BookInfo.books.get(pk=3)
print(book.bpub_date)

使用F()对象可以减少多线程同时操作带来的隐患,但是不支持字符串相加的操作。
可以使用模型的字段A与字段B进行比较,如果A写在了等号的左边,则B出现在等号的右边,需要通过F对象构造。

list.filter(bread__gte=F('bcomment'))

django支持对F()对象使用算数运算

list.filter(bread__gte=F('bcomment') * 2)

F()对象中还可以写入’模型类__列名’进行关联查询

list.filter(isDelete=F('heroinfo__isDelete'))

对于date/time字段,可与timedelta()进行运算

list.filter(bpub_date__lt=F('bpub_date') + timedelta(days=1))

11、Q对象
当我们在查询的条件中需要组合条件时(例如两个条件’且‘或者’或’)时,可以使用Q()查询对象

from django.db.models import Q

Q(bpub_date__gt=date(1992,1,1)&~Q(btitle__startwith="笑")&Q(bpub_date__year=1992)

三、View

视图接受Web请求并且返回Web响应
 视图就是一个Python函数,被定义在view.py中
 响应可以是一张网页的HTML内容,一个重定向,一个404错误等
响应处理过程如下图:
在这里插入图片描述
视图参数的传递
正则表达式非命名分组,通过位置参数传递给视图

url(r'^([0-9]+)/$', views.detail, name="detail")

HTTPRequest对象
。服务器接收到http协议的请求后,会根据报文创建HttpRequest对象
。视图函数的第一个参数是HttpRequest对象
。在django.http模块中定义了HttpRequest对象的API

属性
。path:一个字符串,表示请求的页面的完整路径,不包含域名
。method:一个字符换,表示请求使用的HTTP方法,常用值包括:‘GET’,‘POST’
。encoding: 一个字符串,表示提交的数据的编码格式。如果为None则表示默认utf-8,这个属性科协,可以通过修改它来修改访问表单数据使用的编码、
。GET: 一个类似于字典的对象,包含get请求方式的所有参数。
。POST: 一个类似于字典的独享,包含post请求方式的所有参数
。FILES: 一个类似于字典的对象,包含所有的上传文件
。COOKIES: 一个标准的Python字典,包含所有的cookie,键和值都为字符串
。session: 一个既可读又可写的类似于字典的对象,表示当前的会话,只有当django启用会话的支持时才可用

方法
。is_ajax(): 如果请求是通过XMLHttpRequest发起的,则返回True

QueryDict对象
。定义在django.http.QueryDict
。request对象的属性GET,POST都是QueryDict类型的对象
。与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值得情况
。方法get():根据键获取值。只能获取键的一个值,如果一个键同时拥有多个值,获取最后一个
。方法getlist():根据键获取值。将键的值以列表返回,可以获取一个键的多个值

HttpResponse对象
。在django.http模块中定义了HttpResponse对象的API
。HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建
。不调用模板,直接返回数据

from django.http import HttpResponse
def index(request):
	return HttpResponse("你好")

。调用模板

from django.http import HttpResponse
from django.template import RequestContext, loader
def index(request):
	t1 = loader.get_template("polls/index.html")
	context = RequestContext(reqeust, {"h1": "hello"})
	return HttpResponse(t1.render(context))

属性
。content:表示返回的内容,字符串类型
。charset:表示response采用的编码字符集,字符串类型
。status_code:响应的HTTP响应状态码
。content-type:指定输出的MIME类型

方法
。init:使用页内容实例化HttpResponse对象
。write(content):以文件的方式写
。flush():以文件的方式输出缓存区
。set_cookie(key, value="",max_age=None, expires=None):设置Cookie
 。key、value都是字符串类型
 。max_age是一个整数,表示在指定秒数后过期
 。expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datatime和timedelta值只有在使用PickleSerializer时才可序列化
 。max_age与expires二选一
 。如果不指定过期时间,则两个星期后过期
。delete_cookie(key):删除指定的key的Cookie,如果Key不存在则什么也不发生

子类HttpResponseRedirect
。重定向,服务器跳转
。构造函数的第一个参数用来指定重定向的地址

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse, HttpResponseRedirect
def index(request):
	return HttpResponse("index")
def index2(request,id):
	print(id, type(id))
	return redirect(reverse('redirecttest:redir'))

。应用url配置

from django.conf.urls import url
from . import views
app_name = "redirectest"
urlpatterns = [
	url(r'^$', views.index, name="redir"),
	url(r'^[0-9]+)/$', views.index2)
	]

子类JsonResponse
。返回json数据,一般用于异步请求
init(data)
。帮助用户创建JSON编码的响应
。参数data是字典对象
。JsonResponse的默认Content-type为application/json

from django.http import JsonResponse
def index2(request):
	return JsonResponse({"list": "abc"})

render
。redirect(to)
。为传递进来的参数返回HttpResponseRedirect
。to推荐使用反向解析

from django.shortcuts import redirect
from django.core.urlsolvers import reverse
def index(request):
	return redirect(reverse("booktest:index2"))

状态保持
。http协议是无状态的,每次请求都是一次新的请求,不会记得之前通信的状态
。客户端与服务器端的一次通信,就是一次会话
。实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
。存储方式包括cookie,session,会话一般指session对象
。推荐使用session方式,所有数据存储在服务器端,在客户端cookie中存储session_id
。状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
。不同的请求者之间不会共享这个数据,与请求者一一对应

cookie
在这里插入图片描述
cookie是由服务器生成,存储在浏览器端的一小段文本信息。
。以键值对方式进行存储
。通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器,request.COOKIES
。cookie是基于域名安全的
。cookied是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期

from django.shortcuts import render
from django.http import HttpResponse
def index(request):
	print(request.COOKIES["name"])
	res = HttpResponse("index")
	res.set_cookie("name","zzy")
	return res

session
在这里插入图片描述
session存储在服务器端。
。session是以键值对进行存储的
。session依赖于cookie
。session也是有过期时间,如果不指定,默认两周就会过期

启用session
。使用django-admin startproject创建的项目默认启用
。在settings.py文件中

INSTALLED_APPS列表中添加
'django.contrib.sessions',
MIDDLEWARE_CLASSES列表中添加
'django.contrib.sessions.middleware.SessionMiddleware'

使用session
。启用会话后,每个HttpRequest对象都将具有一个session属性,它是一个类字典对象
。get(key, default=None):根据键获取会话的值
。clear():清除所有会话
。flush():删除当前的会话数据并删除会话的Cookie
。del request.session[‘member_id’]:删除会话

会话过期时间
。set_expiry(value):设置会话的超时时间
。如果没有指定,则两个星期后过期
。如果value是一个整数,会话将在values秒没有活动后过期
。如果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
。如果value是为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
。如果value为None,那么会话永不过期
。修改视图中login_handle函数,查看效果

def login_handle(request):
	request.session["uname"] = request.POST["uname"]
	# request.session.set_expiry(10)
	return redirect("/index")

存储session
。使用存储会话的方式,可以使用settings.py的SESSION_ENGINE项指定
。基于数据库的会话:这是django默认的会话存储方式,需要添加django.contrib.sessions到INSTALLED_APPS设置中,运行manage.py migrate在数据库中安装会话表,可显示指定为

SESSION_ENGINE = 'django.contrib.sessions.backends.db'

。基于缓存的会话:只存在本地内存中,如果丢失则不能找回,比数据库的方式读写更快

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

。可以将缓存和数据库同时使用:优先从本地缓存中获取,如果没有则从数据库中获取

SESSION_ENGINE = 'django.contrib.sessions.backends.cache_db'

使用Redis缓存session
。会话还支持文件,纯cookie、Memcached、Redis等方式存储
。pip install django-redis-sessions
。修改settings中的配置,增加项

SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'

管理redis的命令

启动:sudo redis-server /etc/redis/redis.conf
停止:sudo redis-server stop
重启:sudo redis-server restart
redis-cli:使用客户端连接服务器
keys *:查看所有的键
get name:获取指定键的值
del name:删除指定名称的键

四、模板

。模板语言包括:变量、标签{% 代码块%}、过滤器、注释{# #}

变量
{{variable}}
。当模板引擎遇到一个变量,将计算这个变量,然后将结果输出
。变量名必须由字母,数字,下划线(不能下划线开头)和点组成
。当模板引擎遇到点("."),会按照以下顺序查询:
 1、字典查询,如foo[“bar”]
 2、属性或方法查询,如foo.bar
 3、数字索引查询,如foo[bar]

在模板中调用对象的方法
。在Model.py中定义类HeroInfo

from django.db import models
class HeroInfo(models.Model):
	...
	def showName(self):
		return self.hname

。在views.py中传递HeroInfo对象

from django.shortcuts import render
from models import *
def index(request):
	hero = HeroInfo(hame="abc")
	context  = {"hero": gero}
	return render(request, 'temtest/detail.html', context)

在模板detail.html中调用对象的方法
。在models.py中定义类HeroInfo

from django.db import models
class HeroInfo(models.Model):
	...
	def showName(self):
		return self.name

。在views.py中传递HeroInfo对象

from django.shortcuts import render
from models import *
def index(request):
	hero = HeroInfo(hname="abc")
	context = {"hero": hero}
	return render(request, 'temtest/detail.html', context)

。在模板detail.html中调用

{{hero.showName}}

标签
。语法:{% tag %}
。作用:在输出中创建文本;控制循环或逻辑;加载外部信息到模板中供以后的变量使用
。for标签

{% for ... in ...%}
循环逻辑,表示当前是第几次循环
{% empty %}
给出的列表或列表不存在时,执行此处
{% endfor %}

。if 标签

{% if ..%}
逻辑1
{% if %}
逻辑2
{% if %}
逻辑3
{% endif %}

。comment标签

{% comment %}
多行注释
{% endcomment %}

。include:加载模板并以标签内的参数渲染

{% include "foo/bar.html" %}

。url:反向解析

{% url  'name' p1 p2 %}

。csrf_token:这个标签用于跨站请求伪造保护

{% csrf_token %}

。布尔标签:and , or ,and优先级更高
。block、extends
。autoescape

过滤器
。语法:{{变量|过滤器}},例如{{name|lower}},表示将变量name的值变为小写输出
。使用管道符号(|)来应用过滤器
。通过使用过滤器来改变变量的计算结果
。可以在If标签中使用过滤器结合运算符

if list1|length > 1

。过滤器能够被“串联”,构成过滤器链

name|lower|upper

。default:如果一个变量没有被提供,或者值为false或空,则使用默认值,否则使用变量的值

value|default:"什么也没有"

。date:根据给定格式对一个date变量格式化

value|date:"Y-m-d"

Form表单的功能
1、自动生成HTML表单元素
2、检查表单数据的合法性
3、如果验证错误,重新显示表单(数据不会重置)
4、数据类型转换(字符类型的数据转换成相应的Python类型)

Form相关的对象包括:
1、Widget:用来渲染成HTML元素的工具,如forms.Textarea对应HTML中的标签
2、Field:Form对象中的一个字段,如EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误。
3、Form:一系列Field对象的集合,负责验证和显示HTML元素
4、Form Media:用来渲染表单的CSS和Javascript资源

继承Form
新建forms.py

from django import forms
class AddForm(forms.Form):
	a = forms.IntegerField()
	b = forms.IntegerField()

views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import render
from .forms import AddForms
def index(request):
	if request.method == "GET":
		form = AddForm()
		return render(request, 'formtest/index.html', {"form":form})
	elif request.method == "POST":
			form = AddForm(request.POST)
			if form.is_valid():
				a = form.cleaned_data['a']
				b = form.cleaned_data['b']
				return HttpResponse(str(int(a)) + str(int(b))

对应的模板文件index.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>formtest</title>
</head>
<form action="" method="post">
	{% csrf_token %}
	{{ form }}
<input type="submit" value="提交">
</form>
</body>
</html>

urls.py

from django.conf.urls import url
from . import views
app_name = 'formtest'
urlpatterns = [
	url(r'^$', views.index),
	]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值