【Django】学习笔记

这篇具有很好参考价值的文章主要介绍了【Django】学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Django】学习笔记,# Django,Django

个人主页:丷从心·

系列专栏:Django

【Django】学习笔记,# Django,Django


MVC与MTV

MVC设计模式

【Django】学习笔记,# Django,Django

MTV设计模式

【Django】学习笔记,# Django,Django文章来源地址https://www.toymoban.com/news/detail-860714.html


Django下载

pip install django==2.2.5

Django工程创建与运行

创建工程
django-admin startproject book_manager
运行工程
python manage.py runserver

子应用创建与注册安装

创建子应用
python manage.py startapp book
注册安装子应用
  • 配置settings.py中的INSTALLED_APPS
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book.apps.BookConfig',
]

数据模型

ORM框架
  • 配置models.py
from django.db import models


# Create your models here.

# 书籍信息表
class BookInfo(models.Model):
    name = models.CharField(max_length=10, verbose_name='书籍名称')
    pub_date = models.DateField(null=True, verbose_name='出版日期')
    read_count = models.IntegerField(default=0, verbose_name='阅读量')
    comment_count = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'book_info'
        verbose_name = '书籍信息管理'
        verbose_name_plural = verbose_name


# 人物信息表
class PersonInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )

    name = models.CharField(max_length=10, verbose_name='人物名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='人物性别')
    description = models.CharField(max_length=100, null=True, verbose_name='人物描述')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='人物所属书籍')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'person_info'
        verbose_name = '人物信息管理'
        verbose_name_plural = verbose_name
模型迁移
  • Tools->Run manage.py Task
makemigrations
migrate

Admin站点

修改语言和时区
  • 配置settings.py
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'
设置管理员账号密码
  • Tools->Run manage.py Task
createsuperuser
模型注册
  • 配置admin.py
from django.contrib import admin

# Register your models here.

from .models import BookInfo, PersonInfo

admin.site.register(BookInfo)
admin.site.register(PersonInfo)
显示对象名称
from django.db import models


# Create your models here.

# 书籍信息表
class BookInfo(models.Model):
    name = models.CharField(max_length=10)

    def __str__(self):
        return self.name


# 人物信息表
class PersonInfo(models.Model):
    name = models.CharField(max_length=10)
    gender = models.BooleanField()
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE)

    def __str__(self):
        return self.name
模型显示中文
from django.db import models


# Create your models here.

# 书籍信息表
class BookInfo(models.Model):
    name = models.CharField(max_length=10)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '书籍信息管理'
        verbose_name_plural = verbose_name


# 人物信息表
class PersonInfo(models.Model):
    name = models.CharField(max_length=10)
    gender = models.BooleanField()
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '人物信息管理'
        verbose_name_plural = verbose_name
App显示中文
  • 配置apps.py
from django.apps import AppConfig


class BookConfig(AppConfig):
    name = 'book'
    verbose_name = '书籍管理'

视图函数与路由系统

定义视图函数
  • 配置views.py
from django.shortcuts import render

# Create your views here.

from django.http import HttpResponse


def index(request):
    return HttpResponse('OK!')
配置路由系统
  • 创建子路由:在book文件夹下建立urls.py文件
from django.urls import path
from . import views

urlpatterns = [
    path('index/', views.index),
]
  • 配置总路由
from django.contrib import admin
from django.urls import path, include

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

模板渲染

配置模板路径
  • 在项目根路径下建立templates文件夹
  • 配置settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
  • templates文件夹下建立book文件夹
建立视图
def index_2(request):
    context = {
        'name': '从心',
        'age': '22'
    }

    return render(request, template_name='book/index_2.html', context=c ontext)
建立模板
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>index_2</title>
</head>

<body>
    <div>
        书籍列表
        <ul>
            <li>西游记</li>
            <li>三国演义</li>
        </ul>
    </div>


    <div>
        个人信息
        <div>{{ name }}</div>
        <div>{{ age }}</div>
    </div>

</body>

</html>

配置文件与静态文件

BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG
DEBUG = True
  • 默认工作在DEBUG模式下
  • 修改源代码程序会自动重启
  • Django程序出现异常时会向前端显示详细的错误追踪信息
DEBUG = False

ALLOWED_HOSTS = ['*']
  • ALLOWED_HOSTS为指定的IP访问白名单
静态文件
  • 在项目根目录下建立static文件夹
  • STATIC_URL是静态文件访问路由
  • STATICFILES_DIRS是静态文件存放路径
STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
  • 通过http://127.0.0.1:8000/static/1.jpg访问静态文件

数据库配置

建立数据库book_manager
  • 字符集:utf8mb4
  • 排序规则:utf8mb4_bin
配置settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'localhost',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': 'root',
        'NAME': 'book_manager',
    }
}
安装MySQL驱动
  • 配置__init__.py
import pymysql

pymysql.install_as_MySQLdb()
  • 测试运行,修改最后一个链接
if query is not None:
	query = query.encode(errors='replace')
数据插入
insert into book_info (name, pub_date, read_count, comment_count, is_delete) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);
insert into person_info (name, gender, description, book_id, is_delete) values
('郭靖', 0, '降龙十八掌', 1, 0),
('黄蓉', 1, '打狗棍法', 1, 0),
('黄药师', 0, '弹指神功', 1, 0),
('欧阳锋', 0, '蛤蟆功', 1, 0),
('梅超风', 1, '九阴白骨爪', 1, 0),
('乔峰', 0, '降龙十八掌', 2, 0),
('段誉', 0, '六脉神剑', 2, 0),
('虚竹', 0, '天山六阳掌', 2, 0),
('王语嫣', 1, '神仙姐姐', 2, 0),
('令狐冲', 0, '独孤九剑', 3, 0),
('任盈盈', 1, '弹琴', 3, 0),
('岳不群', 0, '华山剑法', 3, 0),
('东方不败', 1, '葵花宝典', 3, 0),
('胡斐', 0, '胡家刀法', 4, 0),
('苗若兰', 1, '黄衣', 4, 0),
('程灵素', 1, '医术', 4, 0),
('袁紫衣', 1, '六合拳', 4, 0);

数据增加

save()方法
from book.models import BookInfo
book_info = BookInfo(
    name='完美世界',
    pub_date='2013-8-16'
)
book_info.save()
objects.create()方法
from book.models import BookInfo
BookInfo.objects.create(
    name='斗破苍穹',
    pub_date='2014-5-4'
)

数据修改

save()方法
from book.models import BookInfo
book_info = BookInfo.objects.get(id=5)
book_info.name = '斗罗大陆'
book_info.save()
objects.filter().update()方法
from book.models import BookInfo
BookInfo.objects.filter(id=6).update(name='炼气十万年')

数据删除

delete()方法
from book.models import BookInfo
book_info = BookInfo.objects.get(id=6)
book_info.delete()
objects.filter().delete()方法
from book.models import BookInfo
BookInfo.objects.filter(id=5).delete()

数据库查询

基础查询
objects.all()方法
from book.models import BookInfo
BookInfo.objects.all()
objects.count()方法
from book.models import BookInfo
BookInfo.objects.all()
objects.exclude()方法
from book.models import BookInfo
BookInfo.objects.exclude(id=1)
objects.filter()方法
from book.models import BookInfo
BookInfo.objects.filter(id=1)[0]
过滤查询
exact
from book.models import BookInfo
BookInfo.objects.get(id__exact=1)
contains
from book.models import BookInfo
BookInfo.objects.filter(name__contains='湖')
endswith
from book.models import BookInfo
BookInfo.objects.filter(name__endswith='部')
isnull
from book.models import BookInfo
BookInfo.objects.filter(name__isnull=True)
in
from book.models import BookInfo
BookInfo.objects.filter(id__in=[1, 3, 5])
gt
from book.models import BookInfo
BookInfo.objects.filter(id__gt=3)
year
from book.models import BookInfo
BookInfo.objects.filter(pub_date__year=1980)
gte
from book.models import BookInfo
BookInfo.objects.filter(pub_date__gte='1990-1-1')
F对象
from book.models import BookInfo
from django.db.models import F
BookInfo.objects.filter(read_count__gt=F('comment_count') * 2)
Q对象
逻辑与
objects.filter()方法
from book.models import BookInfo
BookInfo.objects.filter(read_count__gt=20, id__lt=3)
# BookInfo.objects.filter(read_count__gt=20).filter(id__lt=3)
Q对象
from book.models import BookInfo
from django.db.models import Q
BookInfo.objects.filter(Q(read_count__gt=20) & Q(id__lt=3))
逻辑或
from book.models import BookInfo
from django.db.models import Q
BookInfo.objects.filter(Q(read_count__gt=20) | Q(id__lt=3))
逻辑非
from book.models import BookInfo
from django.db.models import Q
BookInfo.objects.filter(~Q(id=1))
聚合函数
from book.models import BookInfo
from django.db.models import Sum, Max, Min, Avg, Count
BookInfo.objects.aggregate(Sum('read_count'))
排序函数
正序
from book.models import BookInfo
BookInfo.objects.all().order_by('read_count')
倒序
from book.models import BookInfo
BookInfo.objects.all().order_by('-read_count')
关联查询
访问
一对多的访问
from book.models import BookInfo
book = BookInfo.objects.get(id=1)
book.personinfo_set.all()
多对一的访问
from book.models import PersonInfo
person = PersonInfo.objects.get(id=1)
person.book
# person.book_id
person.book.id
过滤查询
多对一的查询
from book.models import BookInfo
book = BookInfo.objects.filter(personinfo__name='郭靖')
book
book = BookInfo.objects.filter(personinfo__description__contains='八')
book
一对多的查询
from book.models import PersonInfo
people = PersonInfo.objects.filter(book__name='天龙八部')
people
people = PersonInfo.objects.filter(book__read_count__gt=20)
people
切片
from book.models import BookInfo
BookInfo.objects.all()[0:2]
分页
from book.models import BookInfo
from django.core.paginator import Paginator
books = BookInfo.objects.all()
paginator = Paginator(books, 2)
page_1_books = list(paginator.page(1))
page_1_books
paginator.num_pages
惰性执行
  • 如果用变量接收查询语句的返回结果,那么查询语句不会立即执行,而是等到调用该变量时执行
from book.models import BookInfo
books = BookInfo.objects.all()
books
缓存
  • 变量的值存放在系统内存中,如果通过变量进行查询,那么不会对数据库进行查询,而是从内存中查询
from book.models import BookInfo
books = BookInfo.objects.all()
[book.id for book in books]
[book.id for book in books]

HttpRequest

路由参数
配置views.py
def url_data(request, cat_id, sku_id):
    print(cat_id, sku_id)

    return HttpResponse('OK!')
配置urls.py
path('<cat_id>/<sku_id>/', views.url_data)
查询字符串
配置views.py
def query_str_data(request):
    print(request.GET)

    a = request.GET.get('a')
    b = request.GET.get('b')
    print(a, b)

    a_list = request.GET.getlist('a')
    print(a_list)

    return HttpResponse('OK!')
url
http://localhost:8000/query_str_data/?a=1&b=2&a=3
表单数据
配置views.py
def form_data(request):
    print(request.POST)

    username = request.POST.get('username')
    password = request.POST.get('password')

    print(username, password)

    return HttpResponse('OK!')
关闭CSRF
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
JSON数据
配置views.py
def json_data(request):
    json_data = request.body
    dict_data = json.loads(json_data)

    print(dict_data['username'], dict_data['age'])

    return HttpResponse('OK!')
请求头数据
配置views.py
def headers_data(request):
    print(request.META)
    print(request.META['CONTENT_TYPE'])
    print(request.method)
    print(request.path)
    print(request.user)

    return HttpResponse('OK!')
转换器
配置converters.py
from django.urls.converters import register_converter


class TelConverter:
    regex = '1[3-9]\d{9}'

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return str(value)


register_converter(TelConverter, 'tel')
配置views.py
import converters


def tel_data(request, tel_data):
    print(tel_data)

    return HttpResponse('OK!')
配置urls.py
path('<tel:tel_data>/',views.tel_data)

HttpResponse

配置views.py
def http_response(request):
    response = HttpResponse(content='OK!', content_type='text/plain', status=200)
    response['key'] = 'value'

    return response

JsonResponse

配置views.py
def json_response(request):
    books_info = [
        {
            'id': 1,
            'name': '射雕英雄传',
            'pub_date': '1980-5-1'
        },
        {
            'id': 2,
            'name': '天龙八部',
            'pub_date': '1986-7-24'
        }
    ]

    return JsonResponse(data=books_info, safe=False)

Redirect

配置views.py
from django.shortcuts import redirect


def redirect_url(request):
    return redirect('https://www.baidu.com')

Cookie

设置Cookie
配置views.py
def set_cookie(request):
    username = request.GET.get('username')
    password = request.GET.get('password')

    print(username, password)

    response = HttpResponse('OK!')
    response.set_cookie('username', username)
    response.set_cookie('password', password)

    return response
获取Cookie
配置views.py
def get_cookie(request):
    print(request.COOKIES)

    username = request.COOKIES.get('username')
    password = request.COOKIES.get('password')

    return HttpResponse(f'username: {username}, password: {password}')

Session

设置Session
配置views.py
def set_session(request):
    username = request.GET.get('username')
    user_id = 1

    request.session['username'] = username
    request.session['user_id'] = user_id

    del request.session['user_id']
    # request.session.clear()
    # request.session.flush()

    request.session.set_expiry(60)

    return HttpResponse('OK!')
获取Session
配置views.py
def get_session(request):
    username = request.session.get('username')
    user_id = request.session.get('user_id')

    return HttpResponse(f'username: {username}, user_id: {user_id}')
保存Session到Redis
配置settings.py
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

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

类视图

类视图定义
配置views.py
from django.views import View


class LoginView(View):
    def get(self, request):
        return HttpResponse(f'当前请求为: {request.method}')

    def post(self, request):
        return HttpResponse(f'当前请求为: {request.method}')
配置urls.py
path('login/', views.LoginView.as_view())
多继承
配置views.py
from django.contrib.auth.mixins import LoginRequiredMixin


class OrderLoginView(LoginRequiredMixin, View):
    def get(self, request):
        return HttpResponse('个人中心页面')

    def post(self, request):
        return HttpResponse('个人中心页面')

中间件

中间件定义
配置middleware.py
from django.utils.deprecation import MiddlewareMixin


class TestMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print('每次请求前, 进行调用')

        username = request.COOKIES.get('username')
        if username is None:
            print('用户信息不存在')
        else:
            print('用户信息存在')

    def process_response(self, request, response):
        print('每次响应前, 进行调用')

        return response
配置settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'book.middlewares.TestMiddleware'
]

到了这里,关于【Django】学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django+Celery学习笔记

    Django+Celery学习笔记 DJANGO中使用CELERY实现定时任务(用DJCELERY) https://www.cnblogs.com/wumingxiaoyao/p/8521567.html Django中celery机制的使用总结 https://blog.csdn.net/Enjolras_fuu/article/details/108513357 代码 https://github.com/furuiyang0715/celery_learn 参考 https://www.celerycn.io/yong-hu-zhi-nan/canvas-she-ji-gong-zuo-liu-che

    2024年02月12日
    浏览(38)
  • Django学习笔记-创建菜单界面

    笔记内容转载自 AcWing 的 Django 框架课讲义,课程链接:AcWing Django 框架课。 (1)系统设计 menu :菜单页面; playground :游戏界面; settings :设置界面。 (2)文件结构 templates :管理 HTML 文件; urls :管理路由,即链接与函数的对应关系; views :管理 HTTP 函数; models :管理

    2024年02月09日
    浏览(32)
  • 【小程序】django学习笔记1

    网页能用,不知道小程序能不能用。应该能吧。。。。。 创建django程序文件包,xxx处是给该文件夹起个名 一个project是由很多个app(小应用)组成的 在文件夹目录下创建一个app,xxx处给该app起个名 app文件夹中views.py是描述对http请求的响应,request是指用户的友好访问。 但都知

    2023年04月16日
    浏览(15)
  • Django学习笔记-实现聊天系统

    笔记内容转载自 AcWing 的 Django 框架课讲义,课程链接:AcWing Django 框架课。 聊天系统整体可以分为两部分:输入框与历史记录。 我们需要先修改一下之前代码中的一个小 BUG,当在一个窗口中按 Q 时,另一个窗口中点击鼠标左键也能攻击,因为按下按键的事件被所有窗口都捕

    2024年02月07日
    浏览(38)
  • Django学习笔记:第二章django的安装和创建应用

    终端运行 查看django是否安装成功 在控制台运行 在特定文件夹内打开终端运行 生成 进入上图的Scripts文件夹内,打开终端 先正常安装VSCode 再安装python插件 安装Django插件,搜索django,安装前两个 特点 功能完善,开发速度快,安全性强 有完善的在线文档 模型自带数据库ORM组件

    2024年02月16日
    浏览(46)
  • 【Django学习笔记(五)】JQuery介绍

    JQuery 是一个 JavaScript 的第三方模块(第三方类库),可以基于 JQuery 自己开发一个功能,也有很多现成的工具依赖 JQuery,例如 Bootstrap 动态效果。本篇文章中介绍JQuery 的基本功能和依赖于 JQuery 的一些常用工具。 1.1 下载 JQuery 下载网址:Download jQuery 1.2 应用 JQuery 导入JQuery :

    2024年04月16日
    浏览(32)
  • Django学习笔记-模板(Template)基础

    使用模块可以很方便的执行一些数据操作,然后根据传入的数据直接在模板html文件中进行处理。 Django的模板引擎在sttings.py文件中: Django模板引擎中使用“{% %}”来描述python语句,使用“{{ }}”来描述变量,常用语句示例说明如下: 标签 说明 {% extends \\\"模板名\\\" %} 扩展一个母模

    2024年02月15日
    浏览(38)
  • [学习笔记]全面掌握Django ORM

    参考资料:全面掌握Django ORM 学习目标:独立使用django完成orm的开发 学习内容:Django ORM所有知识点 ORM:Object-Relational Mapping Django的ORM详解 在django中,应用的文件夹下面会自动建一个models.py文件。 模型类的优势与劣势 优势:让开发人员专注于业务逻辑处理,提高开发效率。不

    2024年02月15日
    浏览(38)
  • Django学习笔记-实现联机对战

    笔记内容转载自 AcWing 的 Django 框架课讲义,课程链接:AcWing Django 框架课。 多人模式中每个玩家所看到的地图相对来说应该是一样的,因此需要固定地图的长宽比,一般固定为16:9。我们需要在游戏窗口的长宽中取最小值,然后将地图渲染为16:9的大小。 我们在 AcGamePlayground

    2024年02月11日
    浏览(84)
  • 基于Django的Python应用——学习笔记

    环境:Python3.11           Django5.0.1 为项目新建一个目录,将其命名为 learning_log ,再在终端中切换到这个目录,并创建一个虚拟环境。 项目列表生成了这样的一个文件夹 控制台前方出现高亮即为成功 在依然处于活动的虚拟环境的情况下( ll_env 包含在括号内),执行如下命

    2024年02月21日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包