Django入门
Django文档:
https://docs.djangoproject.com/en/1.10/ref/
一、简单创建app
1.1 命令行创建project和app。
django-admin startproject HelloWorld
cd HelloWorld
python manage.py startapp app01
1.2 pycharm创建app

2、将app01加入settings并配置url。



3、启动app
python manage.py runserver 8000
二、
生成环境:
settings.py
DEBUG = False ALLOWED_HOSTS = ["*"]
2.1 配置加载html
或者通过render()返回html页面。
|
1
2
3
4
|
def login(request): # content = open("templates/app01/login.html","r").read() # return HttpResponse(content) return render(request,"app01/login.html") |
注意html里的加载的css,jq,js用http的方式或配置静态文件的方式引入。
2.2 django将表应用到数据库。
python manage.py makemigration #根据class创建创建数据库的配置文件
python manage.py migrate # 根据配置文件创建数据库表
2.3 django创建后台管理员账户
python manage.py createsuperuser
2.4 路由系统
动态路由,正则表达式:
这个(\d+) 会传入news(request,nid)函数。


二级路由
首先创建app01, python manage.py startapp app02
from django.conf.urls import url,include
,在app01目录下的urls.py下配置urls
,在app02目录下的urls.py下配置urls
2.5 数据库操作
数据库连接:
|
1
2
3
4
5
6
7
8
9
10
|
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'day15', 'HOST':'127.0.0.1', 'PORT':'3306', 'USER':'root', 'PASSWORD':'root', }} |
modles.py
|
1
2
3
4
5
|
class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) age = models.IntegerField()# 默认会自动添加自增的id作为主键 |
一对多,多对多
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Author(models.Model): first_name = models.CharField(max_length=32) last_name = models.CharField(max_length=32) email = models.EmailField()class Publisher(models.Model): name = models.CharField(max_length=64,unique=True) address = models.CharField(max_length=128) city = models.CharField(max_length=64) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField()class Book(models.Model): bookname = models.CharField(max_length=128) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publish_date = models.DateField() |
然后,执行python manage.py makemigrations ; python manage.py migrate
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
E:\day15>python2 manage.py makemigrationsMigrations for 'app01': app01\migrations\0002_auto_20160807_2043.py: - Create model Author - Create model Book - Create model Publisher - Add field publisher to bookE:\day15>python2 manage.py migrateOperations to perform: Apply all migrations: admin, app01, auth, contenttypes, sessionsRunning migrations: Rendering model states... DONE Applying app01.0002_auto_20160807_2043... OK |
会生成第三张表:

Django后台管理数据库。
首先在app01的admin.py下注册数据库表
|
1
2
3
4
5
6
|
import models# Register your models here.admin.site.register(models.UserInfo)admin.site.register(models.Author)admin.site.register(models.Book)admin.site.register(models.Publisher) |
创建后台用户:
python manage.py createsuperuser
登录后台并操作表:

定制表在后台返回字符串:
|
1
2
3
4
5
6
|
class Author(models.Model): first_name = models.CharField(max_length=32) last_name = models.CharField(max_length=32) email = models.EmailField() def __unicode__(self): return "author: %s %s"%(self.first_name,self.last_name) |
后台样式:
由于book是需要关联其他标的,所以在新增book数据时,关联字段是不能任意填写的,只能选择:

修改字段:
|
1
|
first_name = models.CharField(max_length=32,null=True) |
python manage.py makemigrations,python manage.py migrate
虽然数据库种这个字段可以为空,但是在Gjango后台还是不能以空插入数据:

要以空值插入数据,需要修改类中的表定义:
|
1
2
3
4
5
6
7
8
9
10
11
|
first_name = models.CharField(max_length=32,null=True,blank=True)"""blank¶Field.blank¶If True, the field is allowed to be blank. Default is False.Note that this is different than null. null is purely database-related, whereas blank is validation-related. If a field has blank=True, form validation will allow entry of an empty value. If a field has blank=False, the field will be required.""" |
参考文档:
https://docs.djangoproject.com/en/1.10/ref/models/fields/
增、删、改、查(针对userinfo表)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def db_h(request): # 增 # models.UserInfo.objects.create(username="ds",password="123",age=18) # 删 # models.UserInfo.objects.filter(username='ds').delete() # 改 # models.UserInfo.objects.filter(age=18).update(age=20) # models.UserInfo.objects.all().update(age=19) # 查 userlist_obj = models.UserInfo.objects.all() users = [] for user in userlist_obj: users.append(user.username) userstring = json.dumps(users) # models.UserInfo.objects.filter(username='ds') # models.UserInfo.objects.filter(age=18).first() return HttpResponse(userstring) |
模糊查找:参见官方文档。
https://docs.djangoproject.com/en/1.10/ref/models/querysets/
https://docs.djangoproject.com/en/1.10/topics/db/queries/
对于上面的多对多手动新增书籍:
|
1
2
3
4
5
6
7
8
|
E:\python27\day15>python2 manage.py shell>>> from datatime import datatime>>> p = models.Publisher.object.filter().first()>>> b = models.Book(bookname="OWASP",publish_date=datetime.now(),publisher=p)>>> b.save()>>> a = models.Author.objects.filter().first()>>> b.authors.add(a)>>> b.authors.remove(a) |
数据库取数据,并将数据传入html
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# app01.viewsdef db_h(request): userlist_obj = models.UserInfo.objects.all() return render(request,"app01/tables.html",{"li":userlist_obj})# templates.app01.tables.html <table> <tr> <th>姓名</th> <th>密码</th> <th>年龄</th> </tr> {% for item in li %} <tr> <td>{{ item.username}}</td> <td>{{ item.password }}</td> <td>{{ item.age }}</td> </tr> {% endfor %} </table> |
2,6 引入静态文件
注意要是列表或元组,
2.7 数据提交。
对于POST请求需在setttings里把跨站请求注释掉。# 'django.middleware.csrf.CsrfViewMiddleware',
我们可以通过POST和GET方式提交,提交到后台的数据通过request.GET或request.POST方式取得,request,method是提交的方法,值为"POST"或"GET"。
('val:', <QueryDict: {u'username': [u'gg'], u'age': [u'21'], u'password': [u'rr']}>) , 这是在后台打印的POST方式的数据。我们可以通过request.POST["username"]获取username的值。
JSON数据转换:
|
1
2
3
4
5
6
7
8
|
# 将字典转为JSON格式(字符串)再发送给客户端response_data_ok = {"status":"ok"}return HttpResponse(json.dumps(response_data_ok))# 客户端接收JSON格式的字符串后再反转为原来的格式"success":function(msg1){ msg = JSON.parse(msg1)} |
未完待续
2.8 Template渲染
基本语法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
E:\day15>python2 manage.py shellPython 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:19:22) [MSC v.1500 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.(InteractiveConsole)>>>>>> from django.template import Context,Template>>> t = Template("My name is {{name}},I'am {{age}} years old")>>> c = Context({"name":"DS","age":18})>>> t.render(c)u"My name is DS,I'am 18 years old">>> for i in [{"name":"DS","age":18},{"name":"lj","age":20}]:... print(t.render(Context(i)))...My name is DS,I'am 18 years oldMy name is lj,I'am 20 years old>>># 深度变量查找1>>> p = {"name":"ow","age":20}>>> t1 = Template("My name is {{person.name}}")>>> c = Context({'person':p})>>> t1.render(c)u'My name is ow'# 深度变量查找2>>> t = Template("My name is {{item.1}}")>>> c = Context({"item":["ds","lj","cc"]})>>> t.render(c)u'My name is lj'# 深度查找3(类)>>> import datetime>>> d = datetime.date(2016,8,7)>>> d.year2016>>> t = Template("today is {{i.year}} {{i.month}} {{i.day}}")>>> c = Context({"i":d})>>> t.render(c)u'today is 2016 8 7' |
Template用于模板文件语法:
|
1
2
3
4
5
6
7
8
9
10
|
{% for item in li %} <tr> <td>{{ item.username}}</td> <td>{{ item.password }}</td> <td>{{ item.age }}</td> </tr>{% endfor %}forloop.counter0 循环计数器value}divisibleby:"2" 能被2整除 |
html继承和重写
模板app01/modle.html
|
1
2
3
4
5
6
7
|
<html><body><div>...</div>{% block content %}{% endblock %}</body></html> |
继承和重写app01/admin.html
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
{% extends "app01/modle.html" %}{% block content %} <div class="container"> <table class="table table-bordered table-hover "> <tr> <th>姓名</th> <th>密码</th> <th>年龄</th> </tr> {% for item in li %} <tr> <td>{{ item.username}}</td> <td>{{ item.password }}</td> <td>{{ item.age }}</td> </tr> {% endfor %} </table> </div>{% endblock %} |
导入
|
1
2
3
4
5
6
7
|
# weather.html<div>Weather</div># login.html{% include "app01/weather.html %} |
Django入门的更多相关文章
- 【django入门教程】Django的安装和入门
很多初学django的朋友,都不知道如何安装django开发以及django的入门,今天小编就给大家讲讲django入门教程. 注明:python版本为3.3.1.Django版本为1.5.1,操作系 ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- python学习笔记--Django入门四 管理站点
上一节 Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分. django.contrib 包 Django自动管理工具是djang ...
- Django 入门
Django 入门 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模型,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容 ...
- Django入门实践(三)
Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...
- Django入门实践(二)
Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...
- Django入门实践(一)
Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...
- Django入门笔记
Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有 ...
- Django 入门案例开发(上)
Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...
- 【Python全栈-后端开发】Django入门基础-2
Django入门基础知识-2 一 .模版 一.模版的组成 HTML代码+逻辑控制代码 二.逻辑控制代码的组成 1 变量(使用双大括号来引用变量) {{var_name}} 2 标签(tag)的使用 ...
随机推荐
- Cesium原理篇:3最长的一帧之地形(4:重采样)
地形部分的原理介绍的差不多了,但之前还有一个刻意忽略的地方,就是地形的重采样.通俗的讲,如果当前Tile没有地形数据的话,则会从他父类的地形数据中取它所对应的四分之一的地形数据.打个比方 ...
- 判断点是否落在面中的Oracle存储过程描述
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 公司在乐亭的项目中,工程同事提出了需要在对接车辆GPS上报点 ...
- WebGIS中解决使用Lucene进行兴趣点搜索排序的两种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 目前跟信息采集相关的一个项目提出了这样的一个需求:中国银行等 ...
- 讲讲Android事件拦截机制
简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...
- MD5
(转载自:http://blog.chinaunix.net/uid-20725556-id-1885710.html) MD5的全称是Message-Digest Algorithm 5(信息-摘要 ...
- ie6,ie7,ie8 css bug兼容解决记录
ie6,ie7,ie8 css bug兼容解决记录 转载自:ie6,ie7,ie8 css bug兼容解决记录 - 前端开发 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面 ...
- APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例
前言 前两篇普及相关基础知识后,本篇主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,除了前两篇的一些了解外,需要有一定的JAVA知识(HTTP相 ...
- 微信浏览器是移动端的IE6?微信升级内核后Html5和CSS3兼容性总结
今年4月,自从微信浏览器X5 升级Blink内核之后,各前端社区一片高潮,仿佛看到了前端er,眼含热泪进而抱头痛头的说:终于可以不用兼容这"移动端的IE6 "了,可以早点回家了!! ...
- asp.net教程:编译错误同时存在于不同dll中
asp.net 编译错误类型“同时存在于”不同的dll中. 出现这种错误大概有三种情况: 1.ASPX页面,一个*.ASPX,对应着一个*.cs文件,两者其实是一个文件,通过两者实现代码分离,每个*. ...
- WPF筛选、排序和分组
可以通过CollectionViewSource或者CollectionView对视图进行排序.筛选和分组. 一.通过CollectionViewSource listingDataView是Coll ...