【实用向】Django 框架入门

声明

这是一篇实用向的Django框架教程博客,适用于想要快速入门的开发者,有前后端开发以及语言基础,想要学习语法或者特性。,包括一些基础的使用,想要学习请结合文章初识 Django并按照我的顺序一步步进行,做完可明白 "做的是什么,能实现什么" 这个问题。主要内容来自 bilibili 慕课网官方账号 咚咚锵老师 三小时带你入门Django框架,不保证内容完全一致,经自己整理过偏向实用向。

创建路由

创建应用

使用 pycharm 创建,也可以使用 startapp 命令

注册应用

settings.py

Python 复制代码
INSTALLED_APPS = [  
    "django.contrib.admin",  
    "django.contrib.auth",  
    "django.contrib.contenttypes",  
    "django.contrib.sessions",  
    "django.contrib.messages",  
    "django.contrib.staticfiles",  
    "blog.apps.BlogConfig"  # 如果使用 pycharm 创建的Django应用则会自动注册
]

编写路由逻辑

blog/views.py

python 复制代码
from django.http import HttpResponse  
  
def hello_world(request):  
    return HttpResponse("helloWorld")

设置应用路由

手动创建 blog/urls.py

Python 复制代码
from django.urls import path  
  
import blog.views  
  
urlpatterns = [  
    path("hello_world", blog.views.hello_world),  
]

项目路由中注册应用路由

helloDjango/urls.py

Python 复制代码
from django.contrib import admin  
from django.urls import path, include  
  
urlpatterns = [  
    path("admin/", admin.site.urls),  
    path("blog/", include("blog.urls"))  
]

相当于是一级路由

效果

访问 http://localhost:8000/blog/hello_world

创建模型层

设计博客模型

字段名称 数据类型 描述
唯一 ID 标记 自增主键 用于唯一标识每篇文章的数据库字段。
文章标题 字符串 表示文章的标题。
作者 字符串 表示文章的作者。
文章内容 字符串 表示文章的具体内容。
发布日期 日期 表示文章的发布日期。

创建博客模型层

blog/models.py

Python 复制代码
from django.db import models  
from django.db.models import Model  
  
  
class Article(models.Model):  
    # 唯一ID标记   
id = models.AutoField(primary_key=True)  
    # 文章标题   
title = models.CharField(max_length=100)  
    # 作者   
author = models.CharField(max_length=50)  
    # 文章内容   
content = models.TextField()  
    # 发布日期   
publish_date = models.DateTimeField(auto_now=True)

生成变更文件

终端使用 makemigrations 命令

运行迁移文件

终端使用 migrate 命令,同步迁移文件到数据库

使用 Django Shell

控制台输入命令 shell

这是一个方便调试的控制台

执行以下代码

Java 复制代码
from  blog.models import Article
a = Article()
a.title = 'test_title'
a.author = 'd0ublecl1ck'
a.content = 'hello world test content'
a.save()

发现数据被成功插入

Django Admin 使用

创建管理员用户

使用命令 createsuperuser 创建管理员用户

登录页面进行管理

访问 http://localhost:8000/admin/ 进行登录

注册 Article 模型到 Admin

要想管理自己的模型,需要先进行注册。

blog/admin.py

Python 复制代码
from django.contrib import admin  
  
from blog.models import Article  
  
  
@admin.register(Article)  
class ArticleAdmin(admin.ModelAdmin):  
    pass

这是 pycharm 默认添加的方式 ,也可以使用下面的方式

Python 复制代码
from django.contrib import admin  
  
from blog.models import Article  
  
admin.site.register(Article)

设置显示 Title

在管理页中可以对模型的数据进行增删改查,但是发现显示的标题是 Article object,如果我们想要显示文章标题怎么设置呢?

只需要在 article 的模型类中添加以下代码

Python 复制代码
def __str__(self):  
    return self.title

这个时候刷新页面就可以正常显示 title 作为标题了

使用 Bootstrap

Bootstrap 官方教程

创建 blog/templates

<head> 中引入,具体去官网查 https://v5.bootcss.com/docs/getting-started/introduction/#cdn-links

html 复制代码
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">

使用视图结合模板

blog/views.py

Python 复制代码
from django.shortcuts import render

def my_view(request):
    # 准备上下文数据
    context = {
        'title': 'My Page Title',
        'body': 'Here is the page body.',
    }
    # 渲染模板并传递上下文
    return render(request, 'my_template.html', context)

blog/templates/my_template.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ body }}</p>
</body>
</html>

RESTful 的简单使用

创建视图

blog/views.py

Python 复制代码
from django.shortcuts import render  
  
from blog.models import Article  
  
  
def detail_by_id(request, id):  
    article = Article.objects.get(id=id)  
    return render(request, 'article_detail.html', {'article': article})

创建模板文件

blog/templates/article_detail.html

html 复制代码
<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>{{ article.title }}</title>  
</head>  
<body>  
<h1>{{ article.title }}</h1>  
<p>作者:{{ article.author }}</p>  
<p>发布日期:{{ article.publish_date }}</p>  
<div>  
    {{ article.content|linebreaks }}  
</div>  
</body>  
</html>

配置路由

blog/urls.py

Python 复制代码
from django.urls import path  
  
import blog.views  
  
urlpatterns = [  
    path("detail/<int:id>", blog.views.detail_by_id),  
]

使用 Paginator 实现分页

定义分页视图

blog/views.py

python 复制代码
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from .models import Article

def article_list(request):
    articles = Article.objects.all()  # 获取所有文章数据
    page = request.GET.get('page', 1)  # 获取当前页码,默认是第1页

    paginator = Paginator(articles, 10)  # 每页显示10条数据
    try:
        articles_page = paginator.page(page)
    except PageNotAnInteger:
        articles_page = paginator.page(1)  # 如果页码不是整数,则显示第一页
    except EmptyPage:
        articles_page = paginator.page(paginator.num_pages)  # 如果页码超出范围,则显示最后一页

    context = {
        'articles': articles_page  # 将分页后的数据传递给模板
    }
    return render(request, 'article_list.html', context)

定义模板

blog/templates/article_list.html

html 复制代码
<!DOCTYPE html>  
<html>  
<head>  
    <title>文章列表</title>  
</head>  
<body>  
<h1>文章列表</h1>  
<ul>  
    {% for article in articles %}  
        <li>{{ article.title }}</li>  
    {% endfor %}  
</ul>  
  
<!-- 分页导航 -->  
<div>  
        <span>            第 {{ articles.number }} 页 / 共 {{ articles.paginator.num_pages }} 页  
        </span>  
    <div>        <!-- 上一页 -->  
        {% if articles.has_previous %}  
            <a href="?page={{ articles.previous_page_number }}">上一页</a>  
        {% endif %}  
  
        <!-- 页码 -->  
        {% for num in articles.paginator.page_range %}  
            {% if num > articles.number|add:'-4' and num < articles.number|add:'4' %}  
                {% if articles.number == num %}  
                    <strong>{{ num }}</strong>  
                {% else %}  
                    <a href="?page={{ num }}">{{ num }}</a>  
                {% endif %}  
            {% endif %}  
        {% endfor %}  
  
        <!-- 下一页 -->  
        {% if articles.has_next %}  
            <a href="?page={{ articles.next_page_number }}">下一页</a>  
        {% endif %}  
    </div>  
</div>  
</body>  
</html>

效果

相关推荐
青云交3 分钟前
大数据新视界 -- Hive 数据分区:提升查询效率的关键步骤(下)(8/ 30)
大数据·数据库·精细化管理·hive 数据分区·分区修剪·分区合并·缓存协同
重生之我是数学王子7 分钟前
QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现
数据库·c++·qt
weixin_4662027810 分钟前
第32周:猴痘病识别(Tensorflow实战第四周)
人工智能·python·tensorflow
sevevty-seven13 分钟前
详细讲解MySQL中的默认索引(B+树)
数据库·b树·mysql
Object~14 分钟前
【第十一课】Rust并发编程(二)
开发语言·后端·rust
蓝天扶光19 分钟前
MySQL事务知识点梳理
数据库·mysql
.生产的驴24 分钟前
SpringBoot 接口加密SM2非对称加密算法 国密算法 公钥加密 私钥解密
java·spring boot·后端·spring·spring cloud·tomcat·gateway
Kika写代码32 分钟前
【大数据技术基础】 课程 第5章 HBase的安装和基础编程 大数据基础编程、实验和案例教程(第2版)
大数据·数据库·hbase
程序猿老罗38 分钟前
Flask 创建API接口服务
后端·python·flask
Adolf_199339 分钟前
Flask 自定义路由转换器
后端·python·flask