青少年编程与数学 02-009 Django 5 Web 编程 10课题、类视图

青少年编程与数学 02-009 Django 5 Web 编程 10课题、类视图

课题摘要: 本文全面介绍了Django中的类视图,包括其基本概念、用法、请求处理、数据获取与处理、模板渲染等方面。类视图通过定义不同的方法处理HTTP请求,提供面向对象的方式来组织视图代码,增强代码的模块化和可重用性。文章还探讨了类视图与函数视图的区别,强调类视图在处理复杂逻辑和共享代码方面的优势。此外,详细讲解了通用类视图的使用方法,如ListViewDetailViewCreateViewUpdateViewDeleteView,这些视图封装了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装饰器限制访问:

    python 复制代码
    from 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用于要求用户登录才能访问视图:

    python 复制代码
    from 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内置了一些通用类视图(如ListViewDetailViewCreateView等),用于快速实现常见的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'),
]

注意事项

  • 在使用通用类视图时,确保你已经定义了相应的模型和表单(如果需要).
  • 通用视图提供了许多可配置的属性和方法,例如querysetfieldsget_context_data()等,你可以根据需要进行自定义和扩展.
  • 对于复杂的业务逻辑,你可能需要结合使用通用视图和自定义视图逻辑,或者在视图中重写某些方法来实现特定的功能.
  • 在模板中,你可以使用Django的模板标签和过滤器来动态生成HTML内容,并访问从视图传递过来的上下文数据.

通过合理地使用通用类视图,你可以快速实现常见的Web功能,提高开发效率,并保持代码的简洁和可维护性.

四、通用类视图的属性和方法

Django的通用类视图提供了许多内置的属性和方法,使你可以快速实现常见的Web功能。以下是一些常用的属性和方法:

常用属性

  • model :指定视图将要操作的模型类。对于ListViewDetailView等,这个属性用于确定要查询的对象。
  • queryset :可以替代model属性,直接提供一个查询集(QuerySet)。这允许你对查询结果进行更复杂的过滤和排序。
  • template_name:指定视图将要使用的模板文件名。
  • context_object_name :用于指定模板上下文中对象的名称。例如,在ListView中,默认使用object_list,但你可以通过此属性自定义为其他名称。
  • fields :在CreateViewUpdateView中使用,指定表单中要包含的字段。
  • form_class :在CreateViewUpdateView中使用,指定要使用的表单类。
  • success_url :在CreateViewUpdateViewDeleteView中使用,指定操作成功后的重定向URL。

常用方法

  • get_queryset():用于获取视图将要操作的查询集。你可以重写此方法来自定义查询逻辑。
  • get_object() :在DetailViewUpdateView中使用,用于获取要操作的单个对象。
  • get_context_data():用于获取模板渲染时的上下文数据。你可以重写此方法来添加额外的上下文变量。
  • get()post()put()delete():这些方法分别用于处理不同类型的HTTP请求。你可以根据需要重写这些方法来实现自定义的请求处理逻辑。
  • form_valid() :在CreateViewUpdateView中使用,当表单数据有效时被调用。你可以重写此方法来执行表单提交后的额外逻辑。
  • form_invalid() :在CreateViewUpdateView中使用,当表单数据无效时被调用。

通过合理地配置和重写这些属性和方法,你可以灵活地使用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的通用类视图(如ListViewDetailView)来简化代码,通用类视图提供了更多的内置功能和配置选项.

七、练习二

以下是一个使用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的工作原理和最佳实践.
相关推荐
鸡鸭扣2 小时前
Docker:3、在VSCode上安装并运行python程序或JavaScript程序
运维·vscode·python·docker·容器·js
paterWang2 小时前
基于 Python 和 OpenCV 的酒店客房入侵检测系统设计与实现
开发语言·python·opencv
东方佑2 小时前
使用Python和OpenCV实现图像像素压缩与解压
开发语言·python·opencv
神秘_博士3 小时前
自制AirTag,支持安卓/鸿蒙/PC/Home Assistant,无需拥有iPhone
arm开发·python·物联网·flutter·docker·gitee
Moutai码农4 小时前
机器学习-生命周期
人工智能·python·机器学习·数据挖掘
m0_748255415 小时前
vscode配置django环境并创建django项目(全图文操作)
vscode·django·sqlite
小白教程5 小时前
python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公
python·python学习·python安装
武陵悭臾6 小时前
网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件
python·selenium·网络爬虫·pyautogui·deepseek·鼠标右键模拟·保存链接为htm
代码猪猪傻瓜coding6 小时前
关于 形状信息提取的说明
人工智能·python·深度学习
码界筑梦坊7 小时前
基于Flask的第七次人口普查数据分析系统的设计与实现
后端·python·信息可视化·flask·毕业设计