Bootstrap

【实用向】Django 框架入门

声明

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

创建路由

创建应用

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

注册应用

settings.py

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

from django.http import HttpResponse  
  
def hello_world(request):  
    return HttpResponse("helloWorld")

设置应用路由

手动创建 blog/urls.py

from django.urls import path  
  
import blog.views  
  
urlpatterns = [  
    path("hello_world", blog.views.hello_world),  
]

项目路由中注册应用路由

helloDjango/urls.py

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

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

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

执行以下代码

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

from django.contrib import admin  
  
from blog.models import Article  
  
  
@admin.register(Article)  
class ArticleAdmin(admin.ModelAdmin):  
    pass

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

from django.contrib import admin  
  
from blog.models import Article  
  
admin.site.register(Article)

在这里插入图片描述

设置显示 Title

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

管理页面

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

def __str__(self):  
    return self.title

在这里插入图片描述

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

在这里插入图片描述

使用 Bootstrap

Bootstrap 官方教程

创建 blog/templates

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

<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">

使用视图结合模板

blog/views.py

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

<!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

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

<!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

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

在这里插入图片描述

使用 Paginator 实现分页

定义分页视图

blog/views.py

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

<!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>

效果

效果

;