声明
这是一篇实用向的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/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
使用视图结合模板
blog/views.py
from django.shortcuts import renderdef 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 Articledef 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>