入门

小Demo设计介绍

  • 本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄
  • 图书表结构设计:
    • 表名:BookInfo
    • 图书名称:btitle
    • 图书发布时间:bpub_date
  • 英雄表结构设计:
    • 表名:HeroInfo
    • 英雄姓名:hname
    • 英雄性别:hgender
    • 英雄简介:hcontent
    • 所属图书:hbook
  • 图书-英雄的关系为一对多

创建应用

  在项目目录下(有manage.py文件的目录)命令行中执行(booktest为应用名):

    python manage.py startapp booktest

  创建成功后目录为

  

运行应用命令(ip可以不写,端口号可以不指定 默认8000 )

  python manage.py runserver   ip:port

设计模型类

  1. from django.db import models
  2. class BookInfo(models.Model):
  3. bittle = models.CharField(max_length=20)
  4. bpub_date = models.DateTimeField()
  5. def __str__(self):
  6. #return self.bittle.encode('utf-8')# python2写法 在3中会报TypeError: __str__returned non-string (type bytes) 错误
  7. return self.bittle # python3写法
  8.  
  9. class HeroInfo(models.Model):
  10. hname = models.CharField(max_length=10)
  11. hgender = models.BooleanField()
  12. hcontent = models.CharField(max_length=1000)
  13. hbook = models.ForeignKey(BookInfo,on_delete=models.CASCADE)#指定外键 级联删除,也就是当删除主表的数据时候从表中的数据也随着一起删除
  14. def __str__(self):
  15. return self.hname

生成数据表 :

  激活模型:在settings.py 的INSTALLED_APPS 最后添加项目的名字

生成迁移文件:根据模型类生成sql语句

  执行  python manage.py makemigrations

执行迁移:执行sql语句生成数据表

  python manage.py migrate

测试数据操作:

  进入python shell :

    python manage.py shell

管理操作

  • 创建一个管理员用户

    python manage.py createsuperuser,按提示输入用户名、邮箱、密码

  在前台地址后面加/admin就是管理界面  例:http://127.0.0.1:8000/admin

  管理界面本地化:

   编辑settings.py文件,可以设置编码、时区  

   LANGUAGE_CODE = 'zh-Hans'

   TIME_ZONE = 'Asia/Shanghai'

向admin注册booktest的模型

  打开admin.py,注册模型

  1. from django.contrib import admin
  2. from .models import *
  3. admin.site.register(BookInfo)

自定义管理页面

  修改admin.py

  通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式

关联对象

  修改admin.py

视图

  ①.修改views.py设计界面 例:

  1. from django.shortcuts import render
  2. from django.http import *
  3. def index(request):
  4. return HttpResponse('hello world')

  ②.urls.py  在urlpatterns添加路径与界面   例:

  1. from django.contrib import admin
  2. from django.urls import path
  3. from booktest import views
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('',views.index)
  7. ]

(django2.X将url改为path

  path转化器

文档原文是Path converters,暂且翻译为转化器。

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  • int,匹配正整数,包含0。
  • slug,匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路径分隔符
  • 使用尖括号(<>)从url中捕获值。

  例:path('<int:id>',views.show)

也可以使用正则表达式  将path改为re_path  (需要引入re_path)

  例:re_path(r'^(\d+)$',views.show)

访问http://localhost:8000/        

模板

  创建模板的目录

        

页面设计

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>hello world</h1>
  9. </body>
  10. </html>

在视图views.py中引入模板

  1. from django.shortcuts import render
  2. from django.http import *
  3. from django.template import RequestContext,loader
  4. def index(request):
  5. temp = loader.get_template('booktest/index.html')
  6. return HttpResponse(temp.render())#temp.render() 渲染 加载页面内容

  可以用render函数代替

  1. from django.shortcuts import render
  2. from django.http import *
  3. def index(request):
  4. return render(request,'booktest/index.html')#书写简单 用此方法更多

效果

获取传递数据

  利用视图views.py中render的第三个参数传递数据

  1. from django.shortcuts import render
  2. from django.http import *
  3. from .models import *
  4. def index(request):
  5. bookList = BookInfo.objects.all()#传递对象
  6. context={'title':'hello','list':bookList}
  7. return render(request,'booktest/index.html',context)#context传递参数

页面接收

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <!--<h1>hello world</h1>-->
  9. <h1>{{ title }}</h1><!--参数获取-->
  10. {% for book in list %} {#在{% %}里写python代码#}
  11. <li>{{ book.bittle}}</li>
  12. {% endfor %}
  13. </body>
  14. </html>

页面效果

在提交ajax请求是报Forbidden (CSRF token missing or incorrect.错误

  需要添加js(可以直接添加,也可以写成js文件引入)

  1. $(function () {
  2. $.ajaxSetup({
  3. headers: { "X-CSRFToken": getCookie("csrftoken") }
  4. });
  5. });
  6. <!--getCookie函数:-->
  7. function getCookie(name)
  8. {
  9. var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
  10.  
  11. if(arr=document.cookie.match(reg))
  12.  
  13. return unescape(arr[2]);
  14. else
  15. return null;
  16. }

===================================================================================================================================

模块

  关联mysql

     安装包 pip install  mysql-python

        pip install mysqlclient

    创建数据库

    在settings.py的DATABASES配置数据库设置

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'test2',#数据库名
  5. 'USER': 'root',#mysql账号
  6. 'PASSWORD': '',#mysql密码
  7. 'HOST': 'localhost',#数据库服务器ip
  8. 'PORT': '',#mysql 端口
  9. }
  10. }

  

  之后正常开发(详情参考上面)  创建应用 python manage.py startapp booktest

                 settings.py  INSTALLED_APPS添加应用

                 定义模型

                 定义属性

                 迁移(生成迁移文件:python manage.py makemigrations,执行迁移:python manage.py migrate)

               

  1. #default,blank是python层面的对象,不影响数据库表结构,不需要重新迁移

  ===========================================================================================================================

存储session

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

使用Redis缓存session

  • 会话还支持文件、纯cookie、Memcached、Redis等方式存储,下面演示使用redis存储
  • 安装包
  1.   pip install django-redis-sessions
  • 修改settings中的配置,增加如下项
  1.   SESSION_ENGINE = 'redis_sessions.session'
  2.   SESSION_REDIS_HOST = 'localhost'
  3.   SESSION_REDIS_PORT = 6379
  4.   SESSION_REDIS_DB = 0
  5.   SESSION_REDIS_PASSWORD = ''
  6.   SESSION_REDIS_PREFIX = 'session'
  • 管理redis的命令
  1.   启动:sudo redis-server /etc/redis/redis.conf
  2.   停止:sudo redis-server stop
  3.   重启:sudo redis-server restart
  4.   redis-cli:使用客户端连接服务器
  5.   keys *:查看所有的键
  6.   get name:获取指定键的值
  7.   del name:删除指定名称的键
  8. ===============================================================================================================================================================================

管理静态文件

  • 项目中的CSS、图片、js都是静态文件

   1.在settings 文件中定义静态内容(STATIC_URL :逻辑路径(虚拟路径) 可以没有真实文件夹,但模板中路径会先匹配此路径,然后在通过下面的配置(物理路径)找文件)

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

  2.在项目根目录下创建static目录,再创建当前应用名称的目录

   例: mysite/static/myapp/

  3.在模板中可以使用硬编码

  1.   例:/static/my_app/myexample.jpg
      
     4.也可以
    在模板中可以使用static编码
      例:
  1. { % load static from staticfiles %} {#在模板中引入模块#}
  2. <img src="{ % static "my_app/myexample.jpg" %}" alt="My image"/>

==============================================================================================================================

中间件

===================================================================================================================================

上传文件

  • 当Django在处理文件上传的时候,文件数据被保存在request.FILES
  • FILES中的每个键为<input type="file" name="" />中的name
  • 注意:FILES只有在请求的方法为POST 且提交的<form>带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象
  • 使用模型处理上传文件:将属性定义成models.ImageField类型
  1.  
  1. pic=models.ImageField(upload_to='cars/')
  • 注意:如果属性类型为ImageField需要安装包Pilow
  • 图片存储路径
    • 在项目static目录下创建media文件夹
    • 图片上传后,会被保存到“/static/media/cars/图片文件”
    • 打开settings.py文件,增加media_root项
  1. MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
  • 使用django后台管理,遇到ImageField类型的属性会出现一个file框,完成文件上传
  • 手动上传的模板代码
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title>文件上传</title>
    5. </head>
    6. <body>
    7. <form method="post" action="/upload/" enctype="multipart/form-data">
    8. {% csrf_token %}
    9. <input type="text" name="title"><br>
    10. <input type="file" name="pic"/><br>
    11. <input type="submit" value="上传">
    12. </form>
    13. </body>
    14. </html>
  • 添加视图路径

    1. path('upload/',views.upload)
  • 手动上传的视图代码
    1. from django.conf import settings
    2. import os
    3. def upload(request):
    4. if request.method == "POST":
    5. f1 = request.FILES['pic']
    6. #fname = '%s\cars\%s' % (settings.MEDIA_ROOT, f1.name)
    7. fname = os.path.join(settings.MEDIA_ROOT, f1.name)
    8. with open(fname, 'wb') as pic:#以二进制读写文件
    9. for c in f1.chunks():
    10. pic.write(c)
    11. return HttpResponse("ok")
    12. else:
    13. return HttpResponse("error")
  1. ==========================================================================================================================================================================

分页

  • Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中
  1. Paginator对象
  • Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数

属性

  • count:对象总数
  • num_pages:页面总数
  • page_range:页码列表,从1开始,例如[1, 2, 3, 4]

方法

  • page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常

异常exception

  • InvalidPage:当向page()传入一个无效的页码时抛出
  • PageNotAnInteger:当向page()传入一个不是整数的值时抛出
  • EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出
  1. Page对象

创建对象

  • Paginator对象的page()方法返回Page对象,不需要手动构造

属性

  • object_list:当前页上所有对象的列表
  • number:当前页的序号,从1开始
  • paginator:当前page对象相关的Paginator对象

方法

  • has_next():如果有下一页返回True
  • has_previous():如果有上一页返回True
  • has_other_pages():如果有上一页或下一页返回True
  • next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
  • previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
  • len():返回当前页面对象的个数
  • 迭代页面对象:访问当前页面中的每个对象
  1. 例:

1.创建视图pagTest

  1. from django.core.paginator import Paginator
  2. def pagTest(request,pIndex=''):
  3. list1 = HeroInfo.objects.all()
  4. p = Paginator(list1, 10)
  5. pIndex = int(pIndex)
  6. list2 = p.page(pIndex)
  7. plist = p.page_range
  8. return render(request, 'booktest/pagTest.html', {'list': list2, 'plist': plist, 'pIndex': pIndex})

2.配置url

  1. path('page/<str:pIndex>/',views.pagTest)

3.定义模板pagTest.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. </head>
  6. <body>
  7. <ul>
  8. {%for area in list%}
  9. <li>{{area.id}}--{{area.hname}}</li>
  10. {%endfor%}
  11. </ul>
  12.  
  13. {%for pindex in plist%}
  14. {%if pIndex == pindex%}
  15. {{pindex}}&nbsp;&nbsp;
  16. {%else%}
  17. <a href="/page/{{pindex}}/">{{pindex}}</a>&nbsp;&nbsp;
  18. {%endif%}
  19. {%endfor%}
  20. </body>
  21. </html>

=====================================================================================================

富文本编辑器

  • 安装django-tinymce    pip install django-tinymce
  • 在settings的INSTALLED_APPS添加应用'tinymce'
  • 在settings.py中添加编辑配置项
  1. TINYMCE_DEFAULT_CONFIG = {
  2. 'theme': 'advanced',
  3. 'width': 600,
  4. 'height': 400,
  5. }

  配置url

  1. path('tinymce/',include('tinymce.urls')),

  在admin中使用需要在模型类中进行配置 例:

  1. from django.db import models
  2. from tinymce.models import HTMLField
  3. class HeroInfo(models.Model):
  4. ...
  5. hcontent = HTMLField()

 自定义使用

  1. def editor(request):
  2. return render(request, 'other/editor.html')
  1. path('editor/',views.editor),
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. <script type="text/javascript" src='/static/tiny_mce/tiny_mce.js'></script>
  6. <script type="text/javascript">
  7. tinyMCE.init({
  8. 'mode':'textareas',
  9. 'theme':'advanced',
  10. 'width':400,
  11. 'height':100
  12. });
  13. </script>
  14. </head>
  15. <body>
  16. <form method="post" action="/content/">
  17. <input type="text" name="hname">
  18. <br>
  19. <textarea name='hcontent'>哈哈,这是啥呀</textarea>
  20. <br>
  21. <input type="submit" value="提交">
  22. </form>
  23. </body>
  24. </html>

  

  

Django随笔的更多相关文章

  1. django随笔说明

    最近学习了vamei的快速Python教程,想着语法学了不用就要忘记,总要拿点东西来练练手,然后又开始学习Django,也算是顺势而为吧. 现在学Django,是跟着教程djangobook学的,内容 ...

  2. 10.13 Django随笔

    2018-10-13 14:20:59 越努力,越幸运! 永远不要高估自己! Django的渲染是在render()时候渲染的,然后把字符串传给浏览器 Django请求流程, 跨域 参考链接: htt ...

  3. Django随笔 01

    Django 视图 不处理用户输入,而仅仅决定要展现哪些数据给用户: Django 模板 仅仅决定如何展现Django视图指定的数据. dd http://blog.csdn.net/pipisorr ...

  4. Django 之 CBV & FBV

    FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django随笔中,一直使用的是这种方式,不再赘述. CBV CBV(class base views) ...

  5. django中外键关联表的查询随笔

    django中,如果一个数据库中的表之间有外键的话可以方便的通过一个表查询到其相关表的数据.如有下面三个model:class Blog(models.Model):    name = models ...

  6. 学习随笔:Django 补充及常见Web攻击 和 ueditor

    判断用户是否登录 <!-- xxx.html --> {% if request.user.is_authenticated %} django中的request对象详解 填错表格返回上次 ...

  7. 学习随笔:Vue.js与Django交互以及Ajax和axios

    1. Vue.js地址 Staticfile CDN(国内): https://cdn.staticfile.org/vue/2.2.2/vue.min.js unpkg:会保持和npm发布的最新的版 ...

  8. The Django Book第六章(Admin)随笔

    要使用Django自带的管理界面,首先得激活- 激活的前提首先在你的项目的seeting目录下的INSTALL_APPS必须有以下的的包 django.contrib.admin django.con ...

  9. django学习随笔:ManagementUtility

    ManagementUtility类,位于django.core.management目录下的__init__.py文件. 这个类,在其init中: def __init__(self, argv=N ...

随机推荐

  1. Linux必备命令

      目录                                                              概述 常用系统工作命令 系统状态检测命令 工作目录切换命令 文本文件 ...

  2. POJ 1260

    //状态转移方程: F[i] = min{f[k] + (a[k+1]+………+a[i]+10} * p[i]} #include <iostream> #define MAXN 105 ...

  3. POJ 1129

    #include<iostream> #include<stdio.h> #include<string> #define MAXN 60 using namesp ...

  4. logcat -- 基本用法

    1.Log类是一个日志类,我们可以在代码中使用logcat打印出消息 常见的日志记录方法有: v(String,String)  --verbose 显示全部信息 d(String,String) - ...

  5. (转)Python标准库02 时间与日期 (time, datetime包)

    原文:http://www.cnblogs.com/vamei/archive/2012/09/03/2669426.html https://www.liaoxuefeng.com/wiki/001 ...

  6. vue制作小程序--server

    服务端代码,开发者工具有提供 指南 https//cloud.tencent.com/document/product/619/11442 参考文档API https://developers.wei ...

  7. Hdfs数据备份

    Hdfs数据备份 一.概述 本文的hdfs数据备份是在两个集群之间进行的,如果使用snapshot在同一个集群上做备份,如果datanode损坏或误操作清空了数据,这样的备份就无法完全保证数据安全性. ...

  8. ES6 笔记(二)- 总结

        在最近进行的项目中,已经全面使用到ES6,这里对ES6进行整理总结.用得比较多的是带*的内容,这些语法.新增类型.模块调用等从代码量上.可读性上.操作上给项目带来了不少便利.   1.语法 1 ...

  9. XRP节点部署

    目录 XRP节点部署 准备 硬软件配置(建议) 安装Rippled服务 一. 以Stock Server模型运行 在何种情况下运行此模式 二 .以 Validator模式运行 在何种情况下运行此模式 ...

  10. JAVA-5NIO之Selector

    转载:并发编程网:ifeve.com NIO教程 Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理 ...