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