Diango:Django基础

一、创建python虚拟机并安装Django

解决同包不同版本的依赖问题,使用python虚拟机。在虚拟机中安装包,不影响实际环境中的包。

虚拟机实际上是复制了物理机上的python环境。

创建虚拟环境命令:

mkvirtualenv <虚拟环境名>

如创建python3虚拟环境:

mkvirtualenv -p python3 bj11_py3

进入虚拟环境工作:

workon <虚拟环境名>

查看机器上有多少个虚拟环境:

workon 空格 + 两个tab键

退出虚拟环境:

deactivate

删除虚拟环境:

rmvirtualenv <虚拟环境名>

虚拟环境下安装包的命令:

pip install 包名

注意:不能使用sudo pip install 包名,这个命令会把包安装到真实的主机环境上而不是安装到虚拟环境中。

查看虚拟环境中安装了哪些python包:

pip list

pip freeze

安装django环境:

pip install django==1.8.2

建立一个django项目步骤如下:

1.创建django项目

2.创建一个application

3.创建application之后,需要对这个application注册。即在setting.py中添加相应代码

在INSTALLED_APPS的末尾添加一行app的名字.

4.运行 python manage.py runserver

二、Django项目结构

Django遵循MVT架构

M:模型 与数据库交互

V:视图 接受请求,进行处理

T:模板 产生HTML页面

创建django项目

文件说明

__init__.py :说明这是一个python包

settings.py :项目的配置文件

url.py :进行url路由

wsgi.py :wsgi协议,web服务器和django交互的入口

manage.py :项目管理文件,通过该文件管理整个项目

创建application

文件说明

admin.py :建立应用与项目之间的联系,需要对应用进行注册。网站后台管理相关文件

models.py :和数据库交互模块

views.py :定义处理函数,视图函数,返回应答

tests.py :写测试代码的文件

数据库配置

三、创建模型

1.在应用的modles.py中编写模型类,继承models.Model类

class Book(models.Model):
    name = models.CharField(max_length=20)  #定义字符串格式,设置最大值
    data = models.DateField #定义时间格式
    number = models.IntegerField    #定义整数格式

指定使用数据库中的哪个表,可在模型类中重写Meta类,该类用于指定表名:

class Meta:
db_table = '表名'

2.创建模型类后,执行命令生成迁移文件

python manage.py makemigrations

执行成功后,在app包下会多出一个migrations包

3.执行迁移生成表

python manege.py migrate

4.在adim.py下设置表管理员

admin.site.register(User_Info)

admin.site.register(User_Info,UserAdmin)	第二个参数表示由哪个用户管理,默认admin

四、通过模型类操作数据表、模型类数据库关系(model)

使用模型类对数据表CRUD

1.在app中的models导入models模块

from django.db import models

2.用模块类创建实例

b = Book()

3.对实例的属性赋值

b.name = "a book"

b.number = 23

4.调用实例的save属性,将内容写入数据库

b.save()

5.查询

模块类中的objects类的get方法可以查询符合条件的实例,并返回该实例。

b2 = Book.objects.get(id=1)

type(b2)

返回:AppTest.models.Book

可以查看b2的属性,如:

h1.book.name

返回: a book

修改属性后,调用save函数,可对数据库进行更新

6.删除

b.delete()

模型的关系

1.创建多类时,在多类中添加外键,外键值为一类的类名(表名),如:

class Hero():

name = models.CharField(max_length=20)

age = models.IntegerField()

#添加外键(django 2.0以上,需要加上on_delete,否则会报错)

book = models.ForeignKey("Book", on_delete=models.CASCADE)

2.创建实例

多类创建实例与一类基本相似,需要注意的是:

多累中的外键的参数是一个对象。即一类的实例。

3.查看关联的表属性

多类:创建多类实例后,该实例的外键属性是一个对象,该对象即一类的实例。故可用那个对象来获取一类实例中的属性。

一类:一类中查看所有相关的多类,用: 实例.多类名_set.all(),或 多类名_set.get() 。

:类名默认小写

五、后台管理(model)

1.本地化(语言、时间)

修改项目下的setting.py文件

2.创建管理员

命令:

python manage.py createsuperuser

创建成功后,在 IP:PORT/admin 进入后台管理界面

3.注册模型类

在应用下的admin.py中注册模型类。

告诉djang框架根据注册的模型类来生成对应表管理页面。

4.自定义管理界面

管理界面默认显示:

如果需要使名字显示自定义的内容,则在模型类中重写__str__函数,该函数返回什么,这里就显示什么。如:

5.自定义管理界面

需在admin.py中写自定义管理模型类。类名可以自定义,如

class BookAdmin(admin.ModelAdmin):

list_display=['name','number']

注: list_display中写的字段即界面上显示的字段。

在admin.py中注册模型类时,参数中指定管理模型类,如:

admin.site.register(Book, BookAdmin)

注: 括号内第一个参数是模型类,第二个参数为管理模型类。

六、视图(view)配置与重定向

1配置应用中的urls.py

在项目下的urls.py中的urlpatterns列表中添加应用下的urls.py

导包:from django.conf.urls import include,url

语法:path('', include("AppTest.urls")), 或

url(r'^', include("AppTest.urls")),

path中有两个参数,第一个为访问时IP后的第一个字符,如admin。第二个参数为用include函数加应用下的urls.py。

2.配置应用下的urls.py

在应用下的urls.py中的urlpatterns列表写入路由,如:

语法:url(r'^index', views.index)

url中有两个参数,第一个参数是浏览器访问的页面,第二个参数为view.py中的函数。

3.定义视图函数,用于返回浏览器请求

在app的views.py内添加视图函数,参数为HttpRequest。需要返回HttpResponse()

from django.http import HttpResponse

def index(request):

return HttpResponse(.......)

注:页面跳转,如果访问一个页面时,要返回的是另一个页面的内容,则return时这样写:

return HttpResponseRedirect('/index')

表示让浏览器再去访问/index。

七、模板(html)

1.设置模板文件目录

在项目的setting.py里的TEMPLATES中的'DIRS'列表中添加模板路径(页面文件存放路径)

在setting.py中,默认有这个变量:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

即项目的绝对路径。可以通过该变量拼接相对路径,使项目移动后仍然可以找到模板文件。

故'DIRS'中可以这样写:

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

注:一般会在templates下新建一个与应用同名的文件夹,在该文件夹下存放对应应用的模板,以分隔应用模板。

2.使用模板文件

在视图函数中使用模板文件(views下的函数)

a)获取模板内容

temp = loader.get_template('python/index.html')

b)定义 上下文

#context = RequestContext(request,{})

context = {替换字典}

c)渲染模板

res_html = temp.render(context)

d)返回给浏览器

return HttpResponse(res_html)

但是django自带render函数,所以可以直接写成:

return render(request, "python/index.html", {"key":"value"})

参数中的字典可以对页面内容进行替换,在页面中用两个大括号把变量圈起来{ {}},然后key对应变量名,value为变量值,即可对页面进行修改。如:

return render(request, "python/index.html", {"context":"让我们来试一试"})

在页面中使用for循环,要用{%%},如:

{% for i in list %}

<li>{
   
   {i}}<li>

{% endfor %}

注:不能直接用range,因为range是一个生成器,不是列表,需要在views中把李斯特替换成列表,如:

return render(request, "python/index.html", {"list":list(range(10))})

从数据库中读取信息并显示:

1.views.py

a)从模板中获取信息

book_list = Book.objects.all()

b)替换页面内容

return render(request,"book/index.html", {"book_list":book_list})

2.页面遍历

{% for book in book_list %}

{
   
   {book}}

</br>

{% endfor %}

八、静态文件配置

1.在项目中创建static文件夹

2.修改setting.py

STATIC_URL = '/static/'

STATICFILES_DIRS = [os.path.join(BASE_DIR + "static")]

html上:

原先写法

{# <link rel="stylesheet" href="/static/css/reset.css"/>#}

不使用路径写法,方便settings改配置static写法

头前:

{% load staticfiles %}

头:

<link rel="stylesheet" href="{% static "css/reset.css" %}"/>

<link rel="stylesheet" href="{% static "css/navigation.css" %}"/>

<link rel="stylesheet" href="{% static "css/register.css" %}"/>

九、模板语言与过滤器

模板语言

1.模板变量

模板变量名是由数字,字母,下划线和点组成的,不能以下划线开头。

使用模板变量:{ {模板变量名}}

模板变量的解析顺序:

例如:{ { book.btitle }}

  1. 首先把book当成一个字典,把btitle当成键名,进行取值book['btitle']
  2. 把book当成一个对象,把btitle当成属性,进行取值book.btitle
  3. 把book当成一个对象,把btitle当成对象的方法,进行取值book.btitle

例如:{ {book.0}}

  1. 首先把book当成一个字典,把0当成键名,进行取值book[0]
  2. 把book当成一个列表,把0当成下标,进行取值book[0]

如果解析失败,则产生内容时用空字符串填充模板变量。

使用模板变量时,.前面的可能是一个字典,可能是一个对象,还可能是一个列表。

2 模板标签

{% 代码段 %}
    for循环:
        {% for x in 列表 %}
        {
   
   {循环内容}}
    # 列表不为空时执行
        {% empty %}
    # 列表为空时执行
        {% endfor %}

可以通过{ { forloop.counter }}得到for循环遍历到了第几次。

{% if 条件 %}

{% elif 条件 %}

{% else %}

{% endif %}

模板中支持逻辑运算,如:

关系比较操作符:> < >= <= == !=

注意:进行比较操作时,比较操作符两边必须有空格。

逻辑运算:not and or

3.模板注释

单行注释: {# 注释内容 #}

多行注释:

{% comment %}

注释内容

{% endcomment %}

过滤器

1.过滤器的使用

过滤器用于对模板变量进行操作。

date:改变日期的显示格式。

length:求长度。字符串,列表.

default:设置模板变量的默认值。

格式:

模板变量|过滤器:参数

如:

{
   
   {book.date|date:'Y年-m月-d日'}}

2.自定义过滤器

  1. 在app下新建名为templatetags的python包。
  2. 在templatetags包中新建py文件,文件名不固定,例:filters.py
  3. 导包
from django.template import Library

4.创建Library对象

register = Library()

5.创建过滤器函数并装饰

#定义函数,进行装饰,装饰后即成为过滤器

@register.filter

def mod(num):

'''判断参数是否为偶数'''

return num%2 == 0

自定义的过滤器函数,至少有一个参数,最多两个。使用过滤器时,默认将 "|" 前的东西作为参数传给过滤器。

如果有两个参数,则默认将 | 前的东西作为第一个参数,在过滤器后面加 :,在 : 后面写第二个参数。如:

{
   
   {book.date|date:'Y年-m月-d日'}}

模板继承

当多个页面都有相同内容时,可使用模板继承,将相同部分写进父模板中,子模板通过继承父模板获取父模板的内容。

子模板继承父模板时,用

{% extends '父模板路径' %}

父模板路径为相对templates路径。继承时,子模板中新建时默认包含的代码都要删去。且直接在子模板中写代码是无效的。

子模板需要写代码时,需要在父模板中先预留块。子模板再重写预留块。

在父模板里可以定义块,使用标签:

{% block 块名 %}

中间内容(块中间可以写内容,也可以不写)

{% endblock 块名%}

子模板去继承父模板之后,可以重写父模板中的某一块的内容。

继承格式:

{% extends 父模板文件路径%}

{% block 块名 %}

{
   
   { block.super}} #获取父模板中块的默认内容

重写的内容

{% endblock 块名%}

模板转义

在views.py中,使用render函数替换模板内容时,如果使用到<h1><h1>之类的标签时,传过去的是字符串,并不会变成标签。所以需要关闭html转义。

如:

模板上下文中的html标记默认是会被转义的。

小于号< 转换为<

大于号> 转换为>

单引号' 转换为'

双引号" 转换为 "

与符号& 转换为 &

关闭方式:

1.使用过滤器

{
   
   { 模板变量|safe}}

2.过滤开关

{% autoescape off %}

模板语言代码

{% endautoescape %}

猜你喜欢

转载自blog.csdn.net/x950913/article/details/108655025