青少年编程与数学 02-009 Django 5 Web 编程 10课题、类视图
- 一、类视图
- 二、区别
- 三、通用类视图
- 四、通用类视图的属性和方法
- 五、自定义通用类视图的模板
- 六、练习一
-
-
- [步骤 1: 定义模型](#步骤 1: 定义模型)
- [步骤 2: 创建类视图](#步骤 2: 创建类视图)
- [步骤 3: 创建模板](#步骤 3: 创建模板)
- [步骤 4: 配置URL](#步骤 4: 配置URL)
- [步骤 5: 运行和测试](#步骤 5: 运行和测试)
- 注意事项
-
- 七、练习二
-
-
- [步骤 1: 创建项目和应用](#步骤 1: 创建项目和应用)
- [步骤 2: 定义模型](#步骤 2: 定义模型)
- [步骤 3: 迁移模型](#步骤 3: 迁移模型)
- [步骤 4: 创建表单](#步骤 4: 创建表单)
- [步骤 5: 创建视图](#步骤 5: 创建视图)
- [步骤 6: 创建模板](#步骤 6: 创建模板)
- [步骤 7: 配置URL](#步骤 7: 配置URL)
- [步骤 8: 运行开发服务器](#步骤 8: 运行开发服务器)
- [步骤 9: 访问应用](#步骤 9: 访问应用)
- 注意事项
-
课题摘要: 本文全面介绍了Django中的类视图,包括其基本概念、用法、请求处理、数据获取与处理、模板渲染等方面。类视图通过定义不同的方法处理HTTP请求,提供面向对象的方式来组织视图代码,增强代码的模块化和可重用性。文章还探讨了类视图与函数视图的区别,强调类视图在处理复杂逻辑和共享代码方面的优势。此外,详细讲解了通用类视图的使用方法,如
ListView
、DetailView
、CreateView
、UpdateView
和DeleteView
,这些视图封装了CRUD操作的基本逻辑,通过配置可快速实现功能。文章还介绍了通用类视图的属性和方法,以及如何自定义模板和上下文数据。最后,通过两个练习项目,展示了如何创建和配置类视图,实现书籍信息的展示和管理功能。
一、类视图
类视图(Class-based views)是Django中实现视图逻辑的另一种方式,它通过定义一个Python类来处理HTTP请求并返回响应。类视图提供了一种面向对象的方式来组织视图代码,使得代码更加模块化、可重用和易于维护。以下是类视图的详细介绍:
基本概念
类视图继承自django.views.View
或其子类,通过定义不同的方法来处理不同类型的HTTP请求。每个HTTP请求方法(如GET、POST、PUT等)对应一个类方法。
- 继承自
View
:所有类视图都直接或间接继承自django.views.View
类。View
类提供了一些基本的请求处理机制和响应生成方法. - 请求处理方法 :类视图通过定义
get()
、post()
、put()
等方法来处理对应的HTTP请求。当请求到达时,Django会根据请求方法调用相应的类方法. as_view()
方法 :类视图通过as_view()
类方法将类转换为可调用的视图函数,以便在URL配置中使用.
基本用法
以下是一个简单的类视图示例,展示如何处理GET和POST请求:
python
# myapp/views.py
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
# 处理GET请求
return HttpResponse("GET request received.")
def post(self, request):
# 处理POST请求
return HttpResponse("POST request received.")
请求处理
在类视图中,你可以根据请求的方法和参数来执行不同的操作:
- 访问请求对象 :通过
self.request
属性访问当前的HTTP请求对象,获取请求信息,如请求方法、请求参数、用户信息等. - 处理GET请求 :通常用于获取数据或渲染页面,可以访问
self.request.GET
字典来获取URL中的查询参数. - 处理POST请求 :通常用于提交表单数据或执行某些操作,可以访问
self.request.POST
字典来获取表单提交的数据.
数据获取和处理
类视图可以从模型中获取数据,并进行必要的处理:
python
# myapp/view.py
from django.shortcuts import render
from .models import Book
class BookListView(View):
def get(self, request):
# 从模型中获取数据
books = Book.objects.all()
# 渲染模板
return render(request, 'book_list.html', {'books': books})
模板渲染
在类视图中,你可以使用Django的模板引擎来渲染数据并生成HTML响应:
python
# myapp/view.py
from django.shortcuts import render
from .models import Book
class BookListView(View):
def get(self, request):
books = Book.objects.all()
return render(request, 'book_list.html', {'books': books})
视图装饰器和混入类
Django提供了多种视图装饰器和混入类,可以用于类视图以实现特定的功能,如权限控制、缓存等:
-
视图装饰器 :可以应用于类视图的方法上,例如使用
@login_required
装饰器限制访问:pythonfrom django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator class MyProtectedView(View): @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs)
-
混入类 :是一些包含特定功能的类,你可以将它们与类视图组合使用,以实现特定的行为。例如,
LoginRequiredMixin
用于要求用户登录才能访问视图:pythonfrom django.contrib.auth.mixins import LoginRequiredMixin class MyProtectedView(LoginRequiredMixin, View): # 只有登录用户才能访问此视图 pass
通用类视图
Django内置了一些通用类视图,用于快速实现常见的CRUD操作:
ListView
:用于显示对象列表。DetailView
:用于显示单个对象的详细信息。CreateView
:用于创建新对象。UpdateView
:用于更新现有对象。DeleteView
:用于删除对象.
这些通用视图提供了处理常见操作的基本逻辑,你可以通过继承和配置这些通用视图来简化视图的编写。例如,使用ListView
显示书籍列表:
python
# myapp/views.py
from django.views.generic import ListView
from .models import Book
class BookListView(ListView):
model = Book
template_name = 'book_list.html'
context_object_name = 'books'
注意事项
- 类视图提供了一种结构化的方式来组织视图逻辑,特别适合处理复杂的请求处理流程和共享代码.
- 在类视图中,可以通过定义
dispatch()
方法来自定义请求分发逻辑,该方法在所有请求处理之前被调用. - 类视图的
as_view()
方法会返回一个视图函数,该函数会创建类的实例并调用相应的请求处理方法. - 通用类视图和混入类可以帮助你快速实现常见的Web功能,但也要注意不要过度依赖它们,以免使代码过于复杂和难以理解.
通过合理地使用类视图,你可以编写出更加模块化、可重用和易于维护的Django应用代码,提高开发效率和代码质量.
二、区别
类视图(Class-based views)和函数视图(Function-based views)是Django中实现视图逻辑的两种主要方式,它们各有特点和适用场景。以下是类视图和函数视图的主要区别:
代码组织方式
- 函数视图:基于函数的视图是通过定义一个简单的Python函数来实现的。函数视图的代码结构相对简单直观,适合处理简单的请求逻辑。
- 类视图:基于类的视图是通过定义一个Python类来实现的。类视图提供了面向对象的方式来组织视图代码,使得代码更加模块化和可重用。你可以通过继承和组合来复用代码和功能.
请求处理方法
- 函数视图:函数视图通过一个函数来处理所有类型的请求。你需要在函数内部判断请求的方法(如GET、POST等),并根据不同的请求方法执行相应的逻辑。
- 类视图 :类视图通过定义不同的方法来处理不同类型的HTTP请求。每个请求方法(如
get()
、post()
等)对应一个类方法。当请求到达时,Django会根据请求方法调用相应的类方法来处理请求.
代码复用和扩展性
- 函数视图:在函数视图中,代码复用通常通过函数调用或装饰器实现。如果你需要在多个视图之间共享逻辑,可能需要编写辅助函数或使用装饰器来包装视图函数。
- 类视图:类视图通过继承和混入类(Mixin)来实现代码复用和功能扩展。你可以创建基类来定义通用的视图逻辑,然后通过继承基类来创建具体的视图类。此外,混入类允许你将特定的功能组合到视图类中,从而实现更灵活的代码复用.
通用视图和内置功能
- 函数视图:Django没有为函数视图提供通用视图的概念。你需要手动编写处理CRUD操作的逻辑,或者使用函数式编程技巧来简化代码.
- 类视图 :Django内置了一些通用类视图(如
ListView
、DetailView
、CreateView
等),用于快速实现常见的CRUD操作。这些通用视图提供了处理特定操作的基本逻辑,你可以通过继承和配置这些通用视图来简化视图的编写.
适用场景
- 函数视图:适用于简单的视图逻辑,特别是当视图功能相对独立且不需要复杂的继承和扩展时。函数视图的代码结构简单,易于理解和编写.
- 类视图:适用于复杂的视图逻辑,特别是当需要共享代码、实现复杂的继承和扩展关系时。类视图的模块化和面向对象特性使得代码更加易于维护和扩展.
示例对比
-
函数视图示例:
python# myapp/views.py from django.http import HttpResponse def my_view(request): if request.method == 'GET': return HttpResponse("GET request received.") elif request.method == 'POST': return HttpResponse("POST request received.")
-
类视图示例:
python# myapp/view.py from django.http import HttpResponse from django.views import View class MyView(View): def get(self, request): return HttpResponse("GET request received.") def post(self, request): return HttpResponse("POST request received.")
总之,函数视图和类视图各有优缺点,选择哪种视图方式取决于具体的项目需求、代码复杂度和个人偏好。在实际开发中,你可以根据实际情况灵活选择或结合使用这两种视图方式,以实现最佳的开发效果和代码质量.
三、通用类视图
通用类视图(Generic Class-based Views)是Django提供的用于快速实现常见Web模式的类视图。它们封装了处理CRUD(创建、读取、更新、删除)操作的基本逻辑,使得你可以通过简单的配置来实现复杂的视图功能。以下是几种常用通用类视图的使用方法:
ListView
ListView
用于展示一个对象列表。它从模型中获取数据,并将其传递给模板进行渲染。
python
# myapp/views.py
from django.views.generic import ListView
from .models import Book
class BookListView(ListView):
model = Book # 指定模型
template_name = 'book_list.html' # 指定模板名称
context_object_name = 'books' # 指定上下文对象名称
在模板book_list.html
中,你可以使用books
变量来访问书籍列表:
html
<!-- myapp/templates/book_list.html -->
{% for book in books %}
<p>{{ book.title }} by {{ book.author }}</p>
{% endfor %}
DetailView
DetailView
用于展示一个对象的详细信息。它根据URL中的参数获取特定的对象,并将其传递给模板。
python
# myapp/view.py
from django.views.generic import DetailView
from .models import Book
class BookDetailView(DetailView):
model = Book
template_name = 'book_detail.html'
context_object_name = 'book'
在模板book_detail.html
中,你可以使用book
变量来访问书籍的详细信息:
html
<!-- myapp/templates/book_detail.html -->
<h1>{{ book.title }}</h1>
<p>Author: {{ book.author }}</p>
<p>Publication Year: {{ book.publication_year }}</p>
CreateView
CreateView
用于创建新的模型实例。它通常与表单一起使用,允许用户输入数据并保存到数据库中。
python
# myapp/view.py
from django.views.generic import CreateView
from .models import Book
from .forms import BookForm
class BookCreateView(CreateView):
model = Book
form_class = BookForm # 指定表单类
template_name = 'book_form.html'
success_url = '/bookstore/' # 指定成功后重定向的URL
在模板book_form.html
中,你可以使用Django的表单模板标签来渲染表单:
html
<!-- myapp/templates/book_form.html -->
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Create Book</button>
</form>
UpdateView
UpdateView
用于更新现有的模型实例。它与CreateView
类似,但需要指定要更新的对象。
python
# myapp/view.py
from django.views.generic import UpdateView
from .models import Book
from .forms import BookForm
class BookUpdateView(UpdateView):
model = Book
form_class = BookForm
template_name = 'book_form.html'
success_url = '/bookstore/'
在模板中,你可以使用与CreateView
相同的表单渲染方式。
DeleteView
DeleteView
用于删除模型实例。它通常显示一个确认页面,然后在用户确认后删除对象。
python
# myapp/view.py
from django.views.generic import DeleteView
from .models import Book
class BookDeleteView(DeleteView):
model = Book
template_name = 'book_confirm_delete.html'
success_url = '/bookstore/'
在模板book_confirm_delete.html
中,你可以显示确认信息并提供删除按钮:
html
<!-- myapp/templates/book_confirm_delete.html -->
<h1>Confirm Delete</h1>
<p>Are you sure you want to delete "{{ object.title }}"?</p>
<form method="post">
{% csrf_token %}
<button type="submit">Confirm Delete</button>
</form>
配置URL
对于每个通用视图,你需要在urls.py
文件中配置相应的URL模式。例如:
python
# myapp/urls.py
from django.urls import path
from .views import BookListView, BookDetailView, BookCreateView, BookUpdateView, BookDeleteView
urlpatterns = [
path('', BookListView.as_view(), name='book_list'),
path('book/<int:pk>/', BookDetailView.as_view(), name='book_detail'),
path('book/create/', BookCreateView.as_view(), name='book_create'),
path('book/<int:pk>/update/', BookUpdateView.as_view(), name='book_update'),
path('book/<int:pk>/delete/', BookDeleteView.as_view(), name='book_delete'),
]
注意事项
- 在使用通用类视图时,确保你已经定义了相应的模型和表单(如果需要).
- 通用视图提供了许多可配置的属性和方法,例如
queryset
、fields
、get_context_data()
等,你可以根据需要进行自定义和扩展. - 对于复杂的业务逻辑,你可能需要结合使用通用视图和自定义视图逻辑,或者在视图中重写某些方法来实现特定的功能.
- 在模板中,你可以使用Django的模板标签和过滤器来动态生成HTML内容,并访问从视图传递过来的上下文数据.
通过合理地使用通用类视图,你可以快速实现常见的Web功能,提高开发效率,并保持代码的简洁和可维护性.
四、通用类视图的属性和方法
Django的通用类视图提供了许多内置的属性和方法,使你可以快速实现常见的Web功能。以下是一些常用的属性和方法:
常用属性
model
:指定视图将要操作的模型类。对于ListView
和DetailView
等,这个属性用于确定要查询的对象。queryset
:可以替代model
属性,直接提供一个查询集(QuerySet)。这允许你对查询结果进行更复杂的过滤和排序。template_name
:指定视图将要使用的模板文件名。context_object_name
:用于指定模板上下文中对象的名称。例如,在ListView
中,默认使用object_list
,但你可以通过此属性自定义为其他名称。fields
:在CreateView
和UpdateView
中使用,指定表单中要包含的字段。form_class
:在CreateView
和UpdateView
中使用,指定要使用的表单类。success_url
:在CreateView
、UpdateView
和DeleteView
中使用,指定操作成功后的重定向URL。
常用方法
get_queryset()
:用于获取视图将要操作的查询集。你可以重写此方法来自定义查询逻辑。get_object()
:在DetailView
和UpdateView
中使用,用于获取要操作的单个对象。get_context_data()
:用于获取模板渲染时的上下文数据。你可以重写此方法来添加额外的上下文变量。get()
、post()
、put()
、delete()
:这些方法分别用于处理不同类型的HTTP请求。你可以根据需要重写这些方法来实现自定义的请求处理逻辑。form_valid()
:在CreateView
和UpdateView
中使用,当表单数据有效时被调用。你可以重写此方法来执行表单提交后的额外逻辑。form_invalid()
:在CreateView
和UpdateView
中使用,当表单数据无效时被调用。
通过合理地配置和重写这些属性和方法,你可以灵活地使用Django的通用类视图来实现各种Web功能,同时保持代码的简洁和可维护性.
五、自定义通用类视图的模板
自定义通用类视图的模板主要涉及指定模板文件和传递上下文数据给模板。以下是详细的步骤和方法:
指定模板文件
在通用类视图中,你可以通过template_name
属性来指定要使用的模板文件名。这个属性告诉Django在渲染视图时应该使用哪个模板文件。
python
# myapp/views.py
from django.views.generic import ListView
from .models import Book
class BookListView(ListView):
model = Book
template_name = 'my_custom_book_list.html' # 指定自定义模板文件
在这个例子中,BookListView
将使用my_custom_book_list.html
作为其模板文件,而不是Django默认生成的模板名称。
创建模板文件
在应用的templates
目录中创建自定义的模板文件。例如,创建my_custom_book_list.html
文件:
html
<!-- myapp/templates/my_custom_book_list.html -->
<!DOCTYPE html>
<html>
<head>
<title>Custom Book List</title>
</head>
<body>
<h1>Custom Book List</h1>
<ul>
{% for book in object_list %}
<li>{{ book.title }} by {{ book.author }}</li>
{% endfor %}
</ul>
</body>
</html>
在这个模板文件中,你可以使用Django模板语言来访问和渲染上下文数据。object_list
是默认的上下文变量名,它包含了从模型中查询到的对象列表。
自定义上下文数据
如果你需要向模板传递额外的上下文数据,可以重写get_context_data()
方法。这个方法用于获取模板渲染时的上下文数据字典。
python
# myapp/view.py
from django.views.generic import ListView
from .models import Book
class BookListView(ListView):
model = Book
template_name = 'my_custom_book_list.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['custom_data'] = 'This is some custom data'
return context
在这个例子中,get_context_data()
方法首先调用父类的get_context_data()
方法来获取默认的上下文数据,然后添加一个名为custom_data
的自定义上下文变量。
在模板中使用自定义上下文数据
在模板文件中,你可以访问和使用自定义的上下文数据:
html
<!-- myapp/templates/my_custom_book_list.html -->
<!DOCTYPE html>
<html>
<head>
<title>Custom Book List</title>
</head>
<body>
<h1>Custom Book List</h1>
<p>{{ custom_data }}</p>
<ul>
{% for book in object_list %}
<li>{{ book.title }} by {{ book.author }}</li>
{% endfor %}
</ul>
</body>
</html>
在这个模板中,{``{ custom_data }}
将显示自定义的上下文数据。
注意事项
- 确保在项目的
settings.py
文件中正确配置了TEMPLATES
设置,特别是DIRS
选项,以便Django能够找到模板文件。 - 你可以根据需要自定义模板文件的结构和样式,使用HTML、CSS和JavaScript来实现所需的页面布局和功能。
- 在模板中,除了访问从视图传递过来的上下文数据外,还可以使用Django模板标签和过滤器来动态生成内容、控制流程等。
通过自定义通用类视图的模板,你可以灵活地控制页面的呈现方式,实现丰富的用户界面和交互功能。
六、练习一
以下是一个使用Django类视图的示例代码,该示例创建了一个简单的书籍列表视图和书籍详情视图。假设我们有一个名为Book
的模型,用于存储书籍信息。
步骤 1: 定义模型
首先,在应用的models.py
文件中定义Book
模型:
python
# myapp/models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
publication_year = models.IntegerField()
is_available = models.BooleanField(default=True)
def __str__(self):
return self.title
步骤 2: 创建类视图
在应用的views.py
文件中创建类视图:
python
# myapp/views.py
from django.shortcuts import render, get_object_or_404
from django.views import View
from .models import Book
class BookListView(View):
def get(self, request):
books = Book.objects.all()
return render(request, 'book_list.html', {'books': books})
class BookDetailView(View):
def get(self, request, book_id):
book = get_object_or_404(Book, id=book_id)
return render(request, 'book_detail.html', {'book': book})
步骤 3: 创建模板
在应用的templates
目录中创建HTML模板文件:
-
book_list.html
:html<!-- myapp/templates/book_list.html --> <!DOCTYPE html> <html> <head> <title>Book List</title> </head> <body> <h1>Book List</h1> <ul> {% for book in books %} <li> <a href="{% url 'book_detail' book.id %}">{{ book.title }}</a> by {{ book.author }} </li> {% endfor %} </ul> </body> </html>
-
book_detail.html
:html<!-- myapp/templates/book_detail.html --> <!DOCTYPE html> <html> <head> <title>{{ book.title }}</title> </head> <body> <h1>{{ book.title }}</h1> <p>Author: {{ book.author }}</p> <p>Publication Year: {{ book.publication_year }}</p> <p>Available: {{ book.is_available }}</p> <a href="{% url 'book_list' %}">Back to Book List</a> </body> </html>
步骤 4: 配置URL
在应用的urls.py
文件中配置URL模式,将URL路径映射到相应的类视图:
python
# myapp/urls.py
from django.urls import path
from .views import BookListView, BookDetailView
urlpatterns = [
path('books/', BookListView.as_view(), name='book_list'),
path('books/<int:book_id>/', BookDetailView.as_view(), name='book_detail'),
]
步骤 5: 运行和测试
启动Django开发服务器:
bash
python manage.py runserver
然后在浏览器中访问以下URL:
- 书籍列表页面:
http://127.0.0.1:8000/books/
- 书籍详情页面:
http://127.0.0.1:8000/books/1/
(假设数据库中有一本书的ID为1)
注意事项
- 确保在项目的
settings.py
文件中将应用添加到INSTALLED_APPS
列表中. - 在实际开发中,你可能还需要为类视图添加更多的功能和逻辑,例如处理POST请求、表单验证、权限控制等.
- 本示例使用了简单的类视图,你也可以使用Django的通用类视图(如
ListView
和DetailView
)来简化代码,通用类视图提供了更多的内置功能和配置选项.
七、练习二
以下是一个使用Django通用类视图的示例项目,展示了一个简单的应用视图的创建和配置过程。这个示例项目包含一个名为bookstore
的应用,用于展示和管理书籍信息。项目结构如下:
myproject/
manage.py
myproject/
__init__.py
settings.py
urls.py
wsgi.py
bookstore/
__init__.py
admin.py
apps.py
models.py
tests.py
urls.py
views.py
templates/
book_list.html
book_detail.html
book_form.html
book_confirm_delete.html
步骤 1: 创建项目和应用
首先,创建一个新的Django项目和一个名为bookstore
的应用:
bash
django-admin startproject myproject
cd myproject
python manage.py startapp bookstore
步骤 2: 定义模型
在bookstore/models.py
文件中定义一个Book
模型:
python
# bookstore/models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
publication_year = models.IntegerField()
is_available = models.BooleanField(default=True)
def __str__(self):
return self.title
步骤 3: 迁移模型
运行以下命令生成并应用数据库迁移:
bash
python manage.py makemigrations
python manage.py migrate
步骤 4: 创建表单
在bookstore/forms.py
文件中创建一个表单类,用于书籍的创建和更新:
python
# bookstore/forms.py
from django import forms
from .models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'author', 'publication_year', 'is_available']
步骤 5: 创建视图
在bookstore/views.py
文件中创建通用类视图:
python
# bookstore/views.py
from django.urls import reverse_lazy
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from .models import Book
from .forms import BookForm
class BookListView(ListView):
model = Book
template_name = 'book_list.html'
context_object_name = 'books'
class BookDetailView(DetailView):
model = Book
template_name = 'book_detail.html'
context_object_name = 'book'
class BookCreateView(CreateView):
model = Book
form_class = BookForm
template_name = 'book_form.html'
success_url = reverse_lazy('book_list')
class BookUpdateView(UpdateView):
model = Book
form_class = BookForm
template_name = 'book_form.html'
success_url = reverse_lazy('book_list')
class BookDeleteView(DeleteView):
model = Book
template_name = 'book_confirm_delete.html'
success_url = reverse_lazy('book_list')
步骤 6: 创建模板
在bookstore/templates
目录中创建HTML模板文件:
-
book_list.html
:html<!-- bookstore/templates/book_list.html --> <!DOCTYPE html> <html> <head> <title>Book List</title> </head> <body> <h1>Book List</h1> <a href="{% url 'book_create' %}">Create Book</a> <ul> {% for book in books %} <li> <a href="{% url 'book_detail' book.id %}">{{ book.title }}</a> by {{ book.author }} <a href="{% url 'book_update' book.id %}">Edit</a> <a href="{% url 'book_delete' book.id %}">Delete</a> </li> {% endfor %} </ul> </body> </html>
-
book_detail.html
:html<!-- bookstore/templates/book_detail.html --> <!DOCTYPE html> <html> <head> <title>{{ book.title }}</title> </head> <body> <h1>{{ book.title }}</h1> <p>Author: {{ book.author }}</p> <p>Publication Year: {{ book.publication_year }}</p> <p>Available: {{ book.is_available }}</p> <a href="{% url 'book_list' %}">Back to Book List</a> </body> </html>
-
book_form.html
:html<!-- bookstore/templates/book_form.html --> <!DOCTYPE html> <html> <head> <title>{% if book %}Edit Book{% else %}Create Book{% endif %}</title> </head> <body> <h1>{% if book %}Edit Book{% else %}Create Book{% endif %}</h1> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">Save</button> </form> <a href="{% url 'book_list' %}">Back to Book List</a> </body> </html>
-
book_confirm_delete.html
:html<!-- bookstore/templates/book_confirm_delete.html --> <!DOCTYPE html> <html> <head> <title>Confirm Delete</title> </head> <body> <h1>Confirm Delete</h1> <p>Are you sure you want to delete "{{ object.title }}"?</p> <form method="post"> {% csrf_token %} <button type="submit">Confirm Delete</button> </form> <a href="{% url 'book_list' %}">Back to Book List</a> </body> </html>
步骤 7: 配置URL
在bookstore/urls.py
文件中配置URL模式:
python
# bookstore/urls.py
from django.urls import path
from .views import BookListView, BookDetailView, BookCreateView, BookUpdateView, BookDeleteView
urlpatterns = [
path('', BookListView.as_view(), name='book_list'),
path('book/<int:pk>/', BookDetailView.as_view(), name='book_detail'),
path('book/create/', BookCreateView.as_view(), name='book_create'),
path('book/<int:pk>/update/', BookUpdateView.as_view(), name='book_update'),
path('book/<int:pk>/delete/', BookDeleteView.as_view(), name='book_delete'),
]
然后,在项目的主urls.py
文件中包含bookstore
应用的URL配置:
python
# myproject/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('bookstore/', include('bookstore.urls')),
]
步骤 8: 运行开发服务器
启动Django开发服务器:
bash
python manage.py runserver
步骤 9: 访问应用
在浏览器中访问以下URL:
- 书籍列表页面:
http://127.0.0.1:8000/bookstore/
- 书籍详情页面:
http://127.0.0.1:8000/bookstore/book/1/
(假设数据库中有一本书的ID为1) - 创建书籍页面:
http://127.0.0.1:8000/bookstore/book/create/
- 更新书籍页面:
http://127.0.0.1:8000/bookstore/book/1/update/
(假设数据库中有一本书的ID为1) - 删除书籍页面:
http://127.0.0.1:8000/bookstore/book/1/delete/
(假设数据库中有一本书的ID为1)
注意事项
- 在实际开发过程中,你可能还需要为
Book
模型创建管理员界面,以便在Django admin中管理书籍数据. - 为了使模板正常工作,确保在
myproject/settings.py
文件中正确配置了TEMPLATES
设置,特别是DIRS
选项,以便Django能够找到模板文件. - 本示例假设你已经安装了Django并熟悉基本的Django项目结构和配置。如果你是Django新手,建议先阅读Django的官方文档和教程,以更好地理解Django的工作原理和最佳实践.