Django的CBV实例详解是一个用来展示Django中Class-Based Views(CBV)的实际应用的教程。本教程包含两条示例,本文将详细讲解这两个示例的实现过程。
示例一
第一个示例是一个简单的博客应用,包含文章发布、修改、删除以及文章列表和详细页面。我们首先创建一个Django项目,创建一个名为blog
的应用。
$ django-admin startproject mysite
$ cd mysite
$ python manage.py startapp blog
然后我们创建一个名为Article
的模型,包含文章的标题、正文和发布时间等字段。
# blog/models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
pub_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
接下来我们定义Article
的列表和详细视图,ArticleListView
显示所有的文章列表,ArticleDetailView
显示单篇文章的详细页面。
# blog/views.py
from django.views.generic import ListView, DetailView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'blog/article_list.html'
class ArticleDetailView(DetailView):
model = Article
template_name = 'blog/article_detail.html'
这里使用了Django提供的ListView
和DetailView
视图,与常规的函数视图不同,这些视图类采用了面向对象的编程方式,具有很高的可复用性。
最后,我们需要在blog/urls.py
文件中定义路由,以便能够访问文章列表和详细页面的视图。
# blog/urls.py
from django.urls import path
from .views import ArticleListView, ArticleDetailView
urlpatterns = [
path('', ArticleListView.as_view(), name='article_list'),
path('<int:pk>/', ArticleDetailView.as_view(), name='article_detail'),
]
这里使用path()
函数来定义路由,<int:pk>
表示文章的id,将被传递到ArticleDetailView
中的pk
参数中。
示例二
第二个示例是一个简单的在线购物网站,包含商品列表和商品详情页面。和第一个示例类似,我们也是首先创建一个Django项目,并创建一个名为shop
的应用。
$ django-admin startproject mysite
$ cd mysite
$ python manage.py startapp shop
接下来,我们定义一个名为Product
的模型,包含商品名称、价格、描述等字段。
# shop/models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.FloatField()
description = models.TextField()
def __str__(self):
return self.name
然后,我们创建一个名为ProductListView
的视图,并重写get_context_data()
方法,以便将数据库中的所有商品传递给模板。
# shop/views.py
from django.views.generic import ListView
from .models import Product
class ProductListView(ListView):
model = Product
template_name = 'shop/product_list.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['products'] = Product.objects.all()
return context
在模板中,我们使用{% for %}
模板标签来遍历所有的商品,并展示名称、价格和描述信息。
<!-- shop/product_list.html -->
{% extends 'base.html' %}
{% block content %}
<h1>Products</h1>
<ul>
{% for product in products %}
<li>
<h2>{{ product.name }}</h2>
<p>${{ product.price }}</p>
<p>{{ product.description }}</p>
</li>
{% endfor %}
</ul>
{% endblock %}
最后,我们需要在shop/urls.py
文件中定义路由,以便能够访问商品列表和详细页面的视图。
# shop/urls.py
from django.urls import path
from .views import ProductListView
urlpatterns = [
path('', ProductListView.as_view(), name='product_list'),
]
这里同样使用path()
函数来定义路由,''
表示访问根路由时,将显示商品列表页面。
通过上述两个示例,我们可以了解到Django中Class-Based Views(CBV)的基本用法,以及相关模型、视图和路由的实现方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django的CVB实例详解 - Python技术站