Django学习笔记(1):设计模式、虚拟环境、项目结构、模型类、视图、模板

1.MVC设计模式

核心思想:解耦
MVC:Model,View,Controller
Model:数据以及对数据的方法
View:数据的显示和呈现
Controller:收集用户输入,处理用户交互
在这里插入图片描述

2.MTV模式

与MVC没有什么区别,也是各组件直接为了保持松耦合关系,只是定义上有些许不同。
在这里插入图片描述

3.虚拟环境

基本操作命令
创建虚拟环境 mkvirtualenv 虚拟环境名 -p /usr/bin/python3
进入虚拟环境 workon 虚拟环境名
删除虚拟环境 rmvirtualenv 虚拟环境名
退出虚拟环境 deactivate
查看本机有多少虚拟环境 workon [TAB][TAB]
查看虚拟环境Python中安装的包:pip listpip freeze
创建项目:django-admin startproject 项目名

4.项目目录结构

在这里插入图片描述
__init__.py:说明project001是一个python包。
setting.py:项目的配置文件。
urls.py:进行url路由的配置。
wsgi.py:web服务器和Django交互的入口。
manage.py:管理项目文件。

创建应用python manage.py startapp 应用名
在这里插入图片描述
__init__.py:说明目录是一个python模块。
models.py:写和数据库相关的内容。
views.py:接受请求,进行处理,与M和T进行交互,返回应答。定义处理函数,叫做视图函数,一个函数对应一个请求。
tests.py:写测试代码的文件。
admin.py:与网站后台管理相关的文件。

建立应用和项目之间的联系,需要对应用进行注册
修改settings.py
在这里插入图片描述
运行项目python manage.py runserver

5.模型类

定义模型类
模型类在应用的model.py内定义。
它继承自models类的Model子类,才是一个模型类。
模型类用于生成数据库表。

from django.db import models

# Create your models here.
#book class
class BookInfo(models.Model):
    """book model class"""
    bookTitle = models.CharField(max_length=20) #the name of book
    publish_date = models.DateField() #the date of publishing this book

生成迁移文件

python manage.py makemigrations

在这里插入图片描述
生成的迁移文件如下:
在这里插入图片描述
执行迁移生成表

python manage.py migrate

在这里插入图片描述
生成的数据库表存储在哪里?
django默认使用sqlite数据库
在这里插入图片描述
安装sqlite sudo apt-get install sqliteman
打卡sqlite sqliteman
在这里插入图片描述
通过模型类操作数据库
在这里插入图片描述
在这里插入图片描述
定义表关系

from django.db import models

# Create your models here.
#book class
class BookInfo(models.Model):
    """book model class"""
    bookTitle = models.CharField(max_length=20) #the name of book
    publish_date = models.DateField() #the date of publishing this book

#hero in book
#与BookInfo是一对多关系
class Hero(models.Model):
    hname = models.CharField(max_length=20)
    hgender = models.BooleanField(default=True) #true is male
    hcomment = models.CharField(max_length=128)
    #Build the foreign key relationship between BookInfo and Hero
    #定义关系属性
    hbook = models.ForeignKey('BookInfo')

关系属性在数据库表内是关系属性名_id(外键)
在这里插入图片描述
举例:

>>> from booktest.models import BookInfo,Hero
>>> b = BookInfo()
>>>b.bookTitle = '3-body'
>>>> from datetime import date
>>> b.publish_date = date(2006,12,21)
>>> b.save()
>>> h = Hero()
>>> h.hname = 'luoji'
>>> h.hgender = True
>>> h.hcomment = 'face-to-wall'
>>> h.hbook = b
>>> h.save()

在这里插入图片描述
在这里插入图片描述
通过外键所在表类的对象查看与其关联的对象信息(由1查多):

>>> b.hero_set.all()
[<Hero: Hero object>]

查看一个类里所有的对象列表

BookInfo.objects.all()

6.后台管理

后台管理相关文件:admin.py
(1)本地化
语言和时区本地化

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

(2)创建管理员

python manage.py createsuperuser

启动服务器
在这里插入图片描述
(3)注册模型类
在应用下的admin.py中注册模型类

from booktest.models import BookInfo
# Register your models here.
admin.site.register(BookInfo)

在这里插入图片描述
book info中有一条数据,默认显示为字符串“BookInfo object”,这是调用object对象默认的str()方法导致的,要想人性化显示(显示对象某一属性),则要重写str方法。

class BookInfo(models.Model):
    """book model class"""
    bookTitle = models.CharField(max_length=20) #the name of book
    publish_date = models.DateField() #the date of publishing this book

	#重写str()方法
    def __str__(self):
        return self.bookTitle

(4)自定义管理页面
manage.py内定义模型管理类

#define model management class
class BookInfoAdmin(admin.ModelAdmin):
    list_display = ['id','bookTitle','publish_date']

# Register your models here.
admin.site.register(BookInfo,BookInfoAdmin)

在这里插入图片描述

7.视图

在Django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求。视图函数处理之后,要给浏览器返回页面内容。
(1)定义视图函数
应用-views.py

  • 定义视图函数
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

#http://127.0.0.1:8000/index
def index(request):
    #handle,contract with M and T
    return HttpResponse('Hello,world')
  • 进行url配置,建立url地址与视图的对应关系
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

8.模板

模板不仅仅是一个html文件
模板文件的使用:
(1)创建模板文件夹
(2)配置模板目录
settings.py里有个叫做BASE_DIR的变量,保存项目的绝对路径
在settings.py的TEMPLATES变量配置模板目录
在这里插入图片描述
(3)使用模板文件

  • 加载模板文件
    去模板目录下面获取html文件的内容,得到一个模板对象
  • 定义模板上下文
    向模板文件传递数据
  • 模板渲染
    得到一个标准的html内容
    模板index.html如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>this is template</h1>
</body>
</html>

views.py中对应视图函数如下

from django.template import loader,RequestContext
def index(request):
    #handle,contract with M and T
    #return HttpResponse('Hello,Django')

    #1.加载模板文件
    temp = loader.get_template('index.html')
    #2.定义模板上下文(传数据)
    context = RequestContext(request,{})
    #3.模板渲染
    res_html = temp.render(context)
    return HttpResponse(res_html)

可以将以上视图函数封装为一个方法:

def my_render(request,template_path,context_dict={}):
    # 1.loading template file
    temp = loader.get_template(template_path)
    # 2.send data to template
    context = RequestContext(request, context_dict)
    # 3.make page
    res_html = temp.render(context)
    return HttpResponse(res_html)
#http://127.0.0.1:8000/index
def index(request):
    #handle,contract with M and T
    #return HttpResponse('Hello,Django')
    return my_render(request,'index.html')

其实,django已经帮我们做了以上封装,我们直接调用render()方法即可

return render(request,'index.html')

在模板中使用变量

return render(request,'index.html',{'content':'hello world'})
<body>
<h1>this is template</h1>
<h2>{{ content }}</h2>
</body>

在这里插入图片描述
在模板中使用循环
格式:{% 代码段 %}

return render(request,'index.html',{'content':'hello world','list':list(range(0,11))})
<ul>
    {% for i in list %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值