1,创建 Django 应用
Test/app9
django-admin startapp app9
![](https://img-blog.csdnimg.cn/direct/98d686ac2639485c9e4b2ba71b6701a2.png)
2,注册应用
Test/Test/settings.py
![](https://img-blog.csdnimg.cn/direct/b8edb9c615424627a40d8835efdd81cc.png)
3,添加应用路由
Test/Test/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('app9.urls')),
path('app1/', include('app1.urls')),
path('app2/', include('app2.urls')),
path('app3/', include('app3.urls')),
path('app4/', include('app4.urls')),
path('app5/', include('app5.urls')),
path('app6/', include('app6.urls')),
path('app7/', include('app7.urls')),
path('app8/', include('app8.urls')),
path('app9/', include('app9.urls')),
]
![](https://img-blog.csdnimg.cn/direct/9606f861c8f04600a0470a86cc81d705.png)
4,添加模型
Test/app9/models.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
def __str__(self):
return self.title
![](https://img-blog.csdnimg.cn/direct/959c9d477668413087c54cb44ae6841f.png)
5,注册模型到admin
Test/app9/admin.py
from django.contrib import admin
from .models import Author, Book
admin.site.register(Author)
admin.site.register(Book)
![](https://img-blog.csdnimg.cn/direct/829432e122d54d5dbf3643afa0526556.png)
5.1 创建超级账号
python manage.py createsuperuser
按照提示输入用户名、邮箱和密码。
5.2 通过admin管理后台添加数据
http://127.0.0.1:8000/admin/
http://127.0.0.1:8000/admin/login/?next=/admin/
![](https://img-blog.csdnimg.cn/direct/a5d91fd4535a41c19a53c063731dd110.png)
![](https://img-blog.csdnimg.cn/direct/7136fdbda94e4297bbdb8afde8eff906.png)
添加作者:
- 点击 "Authors"。
- 点击右上角的 "Add Author"。
- 输入作者名称,例如 "小强"。
- 点击 "Save"。
![](https://img-blog.csdnimg.cn/direct/376453dabc234fa5a0a854890e2f0f0d.png)
添加书籍:
- 点击 "Books"。
- 点击右上角的 "Add Book"。
- 输入书名,例如 "java入门到弃坑233"。
- 在 "Author" 字段选择刚才添加的作者 "小强"。
- 点击 "Save"。
- 重复以上步骤添加更多书籍,例如 "学习msql"。
![](https://img-blog.csdnimg.cn/direct/b238568359a14f13a098fd5cf6fc94ba.png)
查看数据库:
app9_author表,id 为2的作者小强,关联app9_book表author_id为2的两本书籍,建立了一对多的关系
![](https://img-blog.csdnimg.cn/direct/fba24dace12c4df9b145c50c96d5883e.png)
![](https://img-blog.csdnimg.cn/direct/ebc8bed04aa74518b5381e51f20025ee.png)
![](https://img-blog.csdnimg.cn/direct/4755bc2198514409a4decc073149c5e0.png)
5.3 执行py脚本实例化添加数据
Test/populate_data.py
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Test.settings')
django.setup()
from app9.models import Author, Book
# 清空现有数据
Author.objects.all().delete()
Book.objects.all().delete()
# 添加作者和书籍
author1 = Author.objects.create(name="小强")
Book.objects.create(title="Django 从入门到入坑", author=author1)
Book.objects.create(title="pyhton 从入门到入坑", author=author1)
author2 = Author.objects.create(name="小龙")
Book.objects.create(title="C++ 从入门到入坑", author=author2)
Book.objects.create(title="java 从入门到入坑", author=author2)
print("数据添加成功!")
![](https://img-blog.csdnimg.cn/direct/03791ee598614c419da31b535579d9cc.png)
查看管理台:
![](https://img-blog.csdnimg.cn/direct/0b2cb5ce0a664396a3cd8f37dbcd98b8.png)
![](https://img-blog.csdnimg.cn/direct/4bd796c938fe48b6822830978e13c52c.png)
查看数据库:
![](https://img-blog.csdnimg.cn/direct/8395e70e5d56443aa395423cc2cf5e44.png)
![](https://img-blog.csdnimg.cn/direct/6a7a40e9f7344b448eba6dde311c5cc3.png)
6,添加视图函数
Test/app9/views.py
from django.shortcuts import render, get_object_or_404
from .models import Author, Book
def author_list(request):
authors = Author.objects.all()
return render(request, '9/author_list.html', {'authors': authors})
def author_detail(request, author_id):
author = get_object_or_404(Author, pk=author_id)
return render(request, '9/author_detail.html', {'author': author})
![](https://img-blog.csdnimg.cn/direct/95462d995d6a44d399e88d88251ea635.png)
7,添加html代码
Test/templates/9/author_list.html
<!DOCTYPE html>
<html>
<head>
<title>Authors</title>
</head>
<body>
<h1>Authors</h1>
<ul>
{% for author in authors %}
<li><a href="{% url 'author_detail' author.id %}">{{ author.name }}</a></li>
{% endfor %}
</ul>
</body>
</html>
![](https://img-blog.csdnimg.cn/direct/813b657e4b374b3185cba6a5a7058801.png)
Test/templates/9/author_detail.html
<!DOCTYPE html>
<html>
<head>
<title>{{ author.name }}</title>
</head>
<body>
<h1>{{ author.name }}</h1>
<h2>Books</h2>
<ul>
{% for book in author.books.all %}
<li>{{ book.title }}</li>
{% endfor %}
</ul>
<a href="{% url 'author_list' %}">Back to Authors</a>
</body>
</html>
![](https://img-blog.csdnimg.cn/direct/6cb46bfe4853471eab2f93ee9684dbd9.png)
8,添加路由地址
Test/app9/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('authors/', views.author_list, name='author_list'),
path('authors/<int:author_id>/', views.author_detail, name='author_detail'),
]
![](https://img-blog.csdnimg.cn/direct/dfabc0ac1c0841baba43f8d75c3087c8.png)
9,访问页面
http://127.0.0.1:8000/app9/authors/
![](https://img-blog.csdnimg.cn/direct/ff120c78542240269875227ee0c218d3.png)
点击作者小强,可以看到他名下的书籍
![](https://img-blog.csdnimg.cn/direct/3cafd93e74c54dbfbaa4d80ae58ed9a6.png)
10,删除作者和书籍
10.1 添加删除视图函数
Test/app9/views.py
from django.shortcuts import render, get_object_or_404
from .models import Author, Book
def author_list(request):
authors = Author.objects.all()
return render(request, '9/author_list.html', {'authors': authors})
def author_detail(request, author_id):
author = get_object_or_404(Author, pk=author_id)
return render(request, '9/author_detail.html', {'author': author})
# 删除书籍
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from .models import Author, Book
def delete_author(request, author_id):
author = get_object_or_404(Author, pk=author_id)
if request.method == 'POST':
author.delete()
messages.success(request, '作者已成功删除!')
return redirect('author_list') # 重定向到作者列表视图
return render(request, '9/confirm_delete_author.html', {'author': author})
![](https://img-blog.csdnimg.cn/direct/3d68a008275c488faacc70ff2151bb61.png)
10.2 添加删除html模版
Test/templates/9/confirm_delete_author.html
<h1>确认删除作者</h1>
<p>你确定要删除 "{{ author.name }}" 吗?</p>
<form method="POST">
{% csrf_token %}
<button type="submit">确认删除</button>
<a href="{% url 'author_list' %}">取消</a>
</form>
![](https://img-blog.csdnimg.cn/direct/0cf54cf01df04bb68b3d458232a8b999.png)
10.3 给列表html添加删除按钮
Test/templates/9/author_list.html
<!DOCTYPE html>
<html>
<head>
<title>Authors</title>
</head>
<body>
<h1>Authors</h1>
<ul>
{% for author in authors %}
<li><a href="{% url 'author_detail' author.id %}">{{ author.name }}</a></li>
{% endfor %}
</ul>
<ul>
{% for author in authors %}
<li>
{{ author.name }}
<a href="{% url 'delete_author' author.id %}">删除</a>
</li>
{% endfor %}
</ul>
</body>
</html>
![](https://img-blog.csdnimg.cn/direct/0775edf310a24950ad3aee4f30788067.png)
10.4 添加路由地址
Test/app9/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('authors/', views.author_list, name='author_list'),
path('authors/<int:author_id>/', views.author_detail, name='author_detail'),
path('delete_author/<int:author_id>/', views.delete_author, name='delete_author'),
]
![](https://img-blog.csdnimg.cn/direct/0dd9add4f53d41f18ccd53165c1f2aba.png)
10.5 访问页面
http://127.0.0.1:8000/app9/authors/
![](https://img-blog.csdnimg.cn/direct/11afead4efac4b2a96dc6a9244f00a15.png)
![](https://img-blog.csdnimg.cn/direct/2e60d3329019412b832a32d79bf6362f.png)
![](https://img-blog.csdnimg.cn/direct/263431e810b64029a55947a425c68a54.png)
对比数据库删除前后,可以看到与小强关联的两本书,在删除作者小强后也被一并删除了。
![](https://img-blog.csdnimg.cn/direct/d484f2f057de4b618bd5324d5fc3b422.png)
![](https://img-blog.csdnimg.cn/direct/c7b0382591e541898f39032f7d1faefc.png)
![](https://img-blog.csdnimg.cn/direct/c28cbe96b5be4fd9b8d6372834e2a865.png)
![](https://img-blog.csdnimg.cn/direct/7584525257ea49f8823cf1e5494aa1d3.png)