Django入门

news2024/11/15 21:51:15

Django

中文官网:初识 Django | Django 文档 | Django (djangoproject.com)

Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。

使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

MVC 优势:

  • 低耦合
  • 开发快捷
  • 部署方便
  • 可重用性高
  • 维护成本低

Python 加 Django 是快速开发、设计、部署网站的最佳组合。

特点

  • 强大的数据库功能
  • 自带强大的后台功能
  • 优雅的网址

安装教程

参考:(19条消息) django安装教程_哇咔君i的博客-CSDN博客_django安装

命令

在这里插入图片描述

常用命令:

在这里插入图片描述
在这里插入图片描述

新建项目
django-admin startproject HelloWorld
新建应用
python manage.py startapp blog
启动
python manage.py runserver

第一个应用helloWorld

在这里插入图片描述

blog/vews.py

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def hello_word(request):
    return HttpResponse("Hello World")

blog/urls.py

from django.urls import path , include

import blog.views

urlpatterns =[
    path('hello_world',blog.views.hello_word)
]

HelloWorld/urls.py

from django.contrib import admin
from django.urls import path,include

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

HelloWorld/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    #myapp 配置
    'blog.apps.BlogConfig
]

运行访问 ip:端口/blog/hello_world

定义文章模型

blog/models.py

from django.db import models

# Create your models here.

class Article(models.Model):
    # 文章唯一ID
    article_id = models.AutoField(primary_key=True)
    # 文章标题的
    title = models.TextField()
    # 文章的摘要
    brief_content = models.TextField()
    # 文章的主要内容
    content = models.TextField()
    # 文章的发布日期
    publish_date = models.DateTimeField(auto_now=True)

创建模型变更的迁移文件
python manage.py makemigrations
执行迁移文件
python manage.py migrate 

打开django shell 添加文章

命令行

python manage.py shell
引入依赖
from blog.modles import Article

实例化
a = Article()

赋值
a.title = "xxx"

保存到数据库
a.save()

从数据库取出所有数据
articles = Article.objects.all()

打印输出
 print(ax.title)

打开后台管理来添加文章

创建超级管理员

python manage.py createsuperuser

把模型交给后台管理

blog/admin.py

from django.contrib import admin

# Register your models here.

from .models import Article

admin.site.register(Article)

浏览器打开 ip:端口/admin

在这里插入图片描述

获取文章数据并展示

blog/views.py

from django.shortcuts import render
from django.http import HttpResponse
from blog.models import Article

# Create your views here.

def hello_word(request):
    return HttpResponse("Hello World")

def content(request):
    articles = Article.objects.all()
    a = articles[0]
    title = a.title
    brief_content = a.brief_content
    content = a.content
    publish_date = a.publish_date
    return HttpResponse('title:%s,brief_content:%s,' \
           'content:%s,publish_date:%s'%(title,brief_content,content,publish_date))

blog/urls.py

from django.urls import path , include

import blog.views

urlpatterns =[
    path('hello_world',blog.views.hello_word),
    path('content',blog.views.content)
]

访问 ip:端口/blog/content

在这里插入图片描述

使用Django模板引擎

blog中创建templates目录

新建blog目录

新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container page-header">
        <h1>Django 文章
        <small>————DingDingDing</small>
        </h1>
    </div>
    <div class="container page-body">
        <div class="col-md-9" role="main">
            {% for article in article_list %}
            <div>
                <h2>{{article.title}}</h2>
                <p>{{article.content}}</p>
            </div>
            {% endfor %}
        </div>

        <div class="col-md-3" role="complementary">
            <div>
                <h2>最新文章</h2>
                {% for article in article_list %}
                <h4><a>{{article.title}}</a></h4>
                {% endfor %}
            </div>
        </div>

    </div>
</body>
</html>

blog/views.py启用引擎

def get_articles(request):
    articles = Article.objects.all()
    return render(request, 'blog/index.html',
                  {
                      'article_list': articles
                  })

blog/urls.py 配置路由

from django.urls import path , include

import blog.views

urlpatterns =[
    path('hello_world',blog.views.hello_word),
    path('content',blog.views.content),
    path('index',blog.views.get_articles)
]

访问端口:IP:端口 /blog/index

在这里插入图片描述

新建detail.html做详情页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文章详情</title>
      <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>

</head>
<body>
<div class="container page-header">
        <h1>{{article.title}}</h1>
    </div>
    <div class="container page-body">
        <div class="col-md-9" role="main">
            {% for page in pages %}
            <div>
                <p>{{page}}</p>
            </div>
            {% endfor %}
        </div>
    </div>
</body>
</html>

blog/urls.py 设置路由

from django.urls import path , include

import blog.views

urlpatterns =[
    path('hello_world',blog.views.hello_word),
    path('content',blog.views.content),
    path('index',blog.views.get_articles),
    path('detail',blog.views.get_detail)
]

blog/views.py 配置引擎

def get_detail(request):
    article = Article.objects.all()[0]
    pages = article.content.split('\n')
    return render(request, 'blog/detail.html',
                  {
                      'article': article,
                      'pages':pages
                  })

首页跳转详情页

在这里插入图片描述

blog/views.py修改引擎

def get_detail(request,article_id):
    article = Article.objects.all()
    curr_article = None
    for a in article:
        if a.article_id==article_id:
            curr_article = a
            break
    pages = curr_article.content.split('\n')
    return render(request, 'blog/detail.html',
                  {
                      'article': curr_article,
                      'pages':pages
                  })

blog/urls.py修改

urlpatterns =[
    path('hello_world',blog.views.hello_word),
    path('content',blog.views.content),
    path('index',blog.views.get_articles),
    # path('detail',blog.views.get_detail),
    path('detail/<int:article_id>',blog.views.get_detail)
]

详情页上下篇切

blog/views.py改造

def get_detail(request,article_id):
    articles = Article.objects.all()
    curr_article = None
    pre_article = None
    next_article = None
    for index,a in enumerate(articles):
        if index ==0:
            pre_index=index
            next_index=index+1
        elif index==len(articles)-1:
            pre_index = index-1
            next_index = index
        else:
            pre_index = index-1
            next_index = index+1

        if a.article_id==article_id:
            curr_article = a
            pre_article = articles[pre_index]
            next_article = articles[next_index]
            break
    pages = curr_article.content.split('\n')
    return render(request, 'blog/detail.html',
                  {
                      'article': curr_article,
                      'pages':pages,
                      'pre_article':pre_article,
                      'next_article':next_article,
                  })

detail.html改造

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文章详情</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
            integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
            crossorigin="anonymous"></script>

</head>
<body>
<div class="container page-header">
    <h1>{{article.title}}</h1>
</div>
<div class="container page-body">
    <div class="col-md-9" role="main">
        {% for page in pages %}
        <div>
            <p>{{page}}</p>
        </div>
        {% endfor %}
    </div>
</div>
<div>
    <nav aria-label="...">
        <ul class="pager">
            <li><a href="/blog/detail/{{pre_article.article_id}}">上一篇:{{pre_article.title}}</a></li>
            <li><a href="/blog/detail/{{next_article.article_id}}">下一篇:{{next_article.title}}</a></li>
        </ul>
    </nav>
</div>
</body>
</html>

首页分页

blog/views.py改造


from django.core.paginator import Paginator

def get_articles(request):
    page = request.GET.get('page')
    if page:
        page = int(page)
    else:
        page = 1
    print("page:", page)
    articles = Article.objects.all()
    paginator = Paginator(articles, 1)
    page_num = paginator.num_pages
    page_article_list = paginator.page(page)
    next_page = None
    pre_page =None
    if page_article_list.has_next():
        next_page = page+1
    else:
        next_page = page
    if page_article_list.has_previous:
        pre_page = page-1
    else:
        pre_page = page
    return render(request, 'blog/index.html',
                  {
                      'article_list': page_article_list,
                      'page_num': range(1, page_num + 1),
                      'curr_page': page,
                      'next_page': next_page,
                      'pre_page': pre_page
                  })

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
            integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
            crossorigin="anonymous"></script>
</head>
<body>
<div class="container page-header">
    <h1>Django 文章
        <small>————DingDingDing</small>
    </h1>
</div>
<div class="container page-body">
    <div class="col-md-9" role="main">
        {% for article in article_list %}
        <div>
            <h2><a href="/blog/detail/{{article.article_id}}">{{article.title}}</a></h2>
            <p>{{article.brief_content}}</p>
        </div>
        {% endfor %}
        <div class="body-footer">
            <div class="col-md-4 col-md-offset-3">
                <nav aria-label="Page navigation">
                    <ul class="pagination">
                        <li>
                            <a href="/blog/index?page={{next_page}}" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>
                        {% for page in page_num %}
                        <li><a href="/blog/index?page={{page}}">{{page}}</a></li>
                        {% endfor %}
                        <li>
                            <a href="/blog/index?page={{pre_page}}" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>
                    </ul>
                </nav>
            </div>
        </div>
    </div>

    <div class="col-md-3" role="complementary">
        <div>
            <h2>最新文章</h2>
            {% for article in article_list %}
            <h4><a href="/blog/detail/{{article.article_id}}">{{article.title}}</a></h4>
            {% endfor %}
        </div>
    </div>

</div>
</body>
</html>	

排序

def get_articles(request):
    page = request.GET.get('page')
    if page:
        page = int(page)
    else:
        page = 1
    print("page:", page)
    articles = Article.objects.all()
    paginator = Paginator(articles, 1)
    page_num = paginator.num_pages
    page_article_list = paginator.page(page)
    #-------------------------start
    top5_article = Article.objects.order_by('-publish_date')[:5]
    # top5_article = Article.objects.order_by('publish_date')[:5] 正序
    next_page = None
    pre_page =None
    if page_article_list.has_next():
        next_page = page+1
    else:
        next_page = page
    if page_article_list.has_previous:
        pre_page = page-1
    else:
        pre_page = page
    return render(request, 'blog/index.html',
                  {
                      'article_list': page_article_list,
                      'page_num': range(1, page_num + 1),
                      'curr_page': page,
                      'next_page': next_page,
                      'pre_page': pre_page,
                      'top5_article':top5_article
                  })

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 学习笔记001-发布

Python 学习笔记001-发布Python如何发布为EXE文件发给别人装X0 我的开发环境Step 1 安装PyInstaller包Step2 打包Python文件Step 3 运行Python程序Step 4 最后附上Atm.py的代码Python如何发布为EXE文件发给别人装X 0 我的开发环境 Python : 3.10 PyCharm:2022.03 社区版 Ste…

VIAVI唯亚威光纤高分辨率多模 OTDR 测试方案

VIAVI Solutions 高分辨率多模 OTDR 测试方案设计用于飞机、宇宙飞船、潜艇和舰船中部署的超短多模光纤的特性分析和故障定位 高分辨率多模 OTDR 测试方案是业界紧凑、轻巧的便携装置。它的用户界面经过专门设计&#xff0c;简化了 OTDR 测试和结果读取。 特点 紧凑、轻巧、现…

Oracle --- 视图 索引 语法结构

目录 视图 概念 优点 创建视图 查看视图 ​修改视图 删除视图 索引 概念 分类 普通索引 唯一索引 复合索引 反向键索引 位图索引 存储函数 概念 语法结构 视图 概念 视图 是一种数据库对象&#xff0c;是从 一个或者多个 数据表或视图中导出的 虚表。 视图所…

C#,图像二值化(07)——全局阈值的迭代算法及其源代码

1、 全局阈值的迭代算法 图像阈值分割---迭代算法 (1) 为全局阈值选择一个初始估计值T(图像的平均灰度)。 (2) 用T分割图像。产生两组像素&#xff1a;G1有灰度值大于T的像素组成&#xff0c;G2有小于等于T像素组成。 (3) 计算G1和G2像素的平均灰度值m1和m2&#xff1b; (4) …

机器学习笔记之Sigmoid信念网络(二)醒眠算法

机器学习笔记之Sigmoid信念网络——醒眠算法引言回顾Sigmoid\text{Sigmoid}Sigmoid信念网络的模型表示Sigmoid\text{Sigmoid}Sigmoid信念网络——对数似然梯度求解过程中的问题醒眠算法基于平均场假设变分推断求解后验概率平均场理论求解后验的弊端醒眠算法引言 上一节介绍了对…

jsp+servlet+mysql实现的在线图书商城源码附带论文开题报告及视频指导教程

今天给大家演示的是一款由jspservletmysql实现的在线图书商城系统&#xff0c;主要分为前台后后台管理员功能&#xff0c;前台用户可以浏览查看各类图书信息&#xff0c;可自定义搜索&#xff0c;注册登录后可以将书添加到购物车&#xff0c;购物车中的商品可以提交订单&#x…

【复习笔记】JavaWeb实验重点代码

JavaWeb实验重点代码笔记 一、课上练习题目汇总&#xff08;部分&#xff09; 题目一 基础HTML、CSS和JavaScript 1.1 问题要求 页面上有下拉菜单、文本框、跳转按钮并排放置&#xff0c;当下拉菜单选中某个具体网站名称时&#xff0c;文本框出现其对应的链接地址&#xff0…

Linux环境下vs code中Markdown与PlantUML联合工作

PlantUML是一个可以让你快速编写UML图的组件。 在线服务器 https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 Markdown是一种轻量级标记语言&#xff0c;排版语法简洁&#xff0c;让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写…

零膨胀泊松回归案例分析

零膨胀泊松回归分析 计数研究模型中&#xff0c;常用泊松回归模型&#xff0c;但泊松回归模型理论上是要求平均值与标准差相等&#xff0c;如果不满足&#xff0c;则可使用负二项回归模型 在实际研究中&#xff0c;会出现一种情况即因变量为计数变量&#xff0c;并且该变量包…

Lua闭包和Upvalue上值

一、lua中的作用域 在Lua语言中声明的变量默认是全局变量&#xff0c;声明局部变量需要使用local关键字&#xff0c;和其他语言相比这有点特殊。 -- 全局变量 a 10function func()b 100 -- 仍然是全局变量local c 20 -- func的局部变量 end func()print(a b) -- 输出…

终极.NET混淆器丨.NET Reactor产品介绍

无与伦比的 .NET 代码保护系统&#xff0c;可完全阻止任何人反编译您的代码。 产品优势 01、混淆技术 .NET Reactor通过向 .NET 程序集添加不同的保护层来防止逆向工程。除了标准的混淆技术之外&#xff0c;它还包括NecroBit、虚拟化、x86代码生成或防篡改等特殊功能。NET Re…

xilinx srio ip学习笔记之初识srio

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 xilinx srio ip学习笔记之初识srio前言IP 设置总结前言 因为工作原因&#xff0c;需要对rapidio 的协议进行了解&#xff0c;在xilinx的IP核中&#xff0c;是对应着Serial R…

这支隐藏“球队”,颠覆消费品「赛场」

【潮汐商业评论/原创】 大好的黄金周末&#xff0c;Fred约了几个朋友来家里看球。按照他的计划&#xff0c;周五准备下班后&#xff0c;他赶紧得去一趟附近的大型超市扫货&#xff0c;买一批零食酒水招待朋友。没想到的是&#xff0c;好不容易等到快下班了&#xff0c;领导通知…

外包呆一年,外包的工作经历怎么写?外包的项目经验怎么写?

0. 先来看下大家的各种问题&#xff1f; 外包的工作经历怎么写&#xff1f;外包的项目经验怎么写&#xff1f;外包如何优化简历&#xff1f;进入外包后黑化了简历&#xff0c;如何成功跳出外包圈&#xff1f;外包该如何提升自己&#xff1f;外包仔如何自我救赎&#xff1f; ……

前端基础_离线Web应用概述

离线Web应用概述 在Web应用中使用缓存的原因之一是为了支持离线应用。在全球互联的时代&#xff0c;离线应用仍有其实用价值。当无法上网的时候&#xff0c;你会做什么呢&#xff1f;你可能会说如今网络无处不在&#xff0c;而且非常稳定&#xff0c;不存在没有网络的情况。但…

【服务器数据恢复】误操作导致ocfs2文件系统被格式化的数据恢复案例

服务器故障&#xff1a; 用户误操作将linux文件系统误装入到Ocfs2文件系统的数据卷上&#xff0c;导致原始Ocfs2文件系统被格式化为Ext4文件系统。 因为Ext4文件系统每隔几百兆就会写入文件系统的原始信息&#xff0c;所以本案例中的原始Ocfs2文件系统中的数据可能受到一定程度…

搭建开源版个人图床

在微博图床、gitee、jsDelivr 陆续被 ban 的今天&#xff0c;很有必要搭建自己的图床系统了。 兰空图床 兰空图床官网&#xff1a;https://www.lsky.pro docker版本&#xff1a;https://hub.docker.com/r/halcyonazure/lsky-pro-docker 本次讲解使用 docker 版本进行部署使用 …

linux跟踪技术之ebpf

ebpf简介 eBPF是一项革命性的技术&#xff0c;起源于 Linux 内核&#xff0c;可以在操作系统内核等特权上下文中运行沙盒程序。它可以安全有效地扩展内核的功能&#xff0c;而无需更改内核源代码或加载内核模块。 比如&#xff0c;使用ebpf可以追踪任何内核导出函数的参数&…

漫画电学原理

电是什么 电压 电压是两点的电势差。 电流是指每秒在导线中流动的电量。 电功率是指在1s内消耗的电能。 电的本质是什么 万物都是有原子构成,原子有原子核(正电),核外电子(负电)构成。电子的定向移动形成了电。 电子离开原子,原子的电子减少,从而带正电。带正电的…

互联网时代“陨落”,国家发布元宇宙战略的信号对失业和担心失业的我们带来了什么启迪?

互联网这头“猪 ”真的掉下来了 流量红利已经一去不复返了&#xff01;3年前业界其实已经发出各种密集信号&#xff0c;在当时无论是BAT还是一些经济学家在3年前都已经预测过&#xff0c;互联网的流量模式已经衰竭&#xff0c;并且它将一去不复返。 曾经处于互联网大潮的我们…