一 使用通用视图(代码还是少点好)
二 Django中的测试
https://docs.djangoproject.com/zh-hans/3.2/topics/testing/ https://developer.mozilla.org/zh-CN/docs/learn/Server-side/Django/Testing
2.1 单元测试
首先使用单元测试,确保各个单元的逻辑都没问题后,然后进行集成测试,测试整个系统的可用性。
三 打包应用
https://docs.djangoproject.com/zh-hans/3.2/intro/reusable-apps/
补充:
为了安装这个包,使用 pip (你早已 安装 pip, 对吗?):
python -m pip install django-polls/dist/django-polls-0.1.tar.gz
此时下载的包会在虚拟环境中(如果你使用虚拟环境的话)
幸运的话,你的 Django 项目应该再一次正确运行。启动服务器确认这一点。
- 通过 pip 卸载包:python -m pip uninstall django-polls
四 汉化应用
首先来看一下需要汉化的地方,admin 首页每个版块代表一个 app,比如 BLOG 版块表示 blog 应用,版块标题默认显示的就是应用名。应用版块下包含了该应用全部已经注册到 admin 后台的 model,之前我们注册了 Post、Category 和 Tag,所以显示的是这三个 model,显示的名字就是 model 的名字。如下图所示:
其次是新增 post 页面的表单,各个字段的 label 由定义在 Post 类的 Field 名转换而来,比如 Post 模型中定义了 title 字段,则对应表单的 label 就是 Title。
首先是 BLOG 版块的标题 BLOG,一个版块代表一个应用,显然这个标题使用应用名转换而来,在 blog 应用下有一个 app.py 模块,其代码如下:
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
这些是我们在运行 startapp 创建 blog 应用时自动生成的代码,可以看到有一个 BlogConfig 类,其继承自 AppConfig 类,看名字就知道这是和应用配置有关的类。我们可以通过设置这个类中的一些属性的值来配置这个应用的一些特性的。比如这里的 name 是用来定义 app 的名字,需要和应用名保持一致,不要改。要修改 app 在 admin 后台的显示名字,添加 verbose_name 属性。
name = 'blog'
verbose_name = '博客'
同时,我们此前在 settings 中注册应用时,是直接注册的 app 名字 blog,现在在 BlogConfig 类中对 app 做了一些配置,所以应该将这个类注册进去:
INSTALLED_APPS = [
'django.contrib.admin',
...
'blog.apps.BlogConfig', # 注册 blog 应用
]
再次登录后台,就可以看到 BLOG 版块的标题已经显示为博客了。
接下来是让应用下注册的 model 显示为中文,既然应用是在 apps.py 中配置,那么和 model 有关的配置应该去找相对应的 model 。配置 model 的一些特性是通过 model 的内部类 Meta 中来定义。比如对于 Post 模型,要让他在 admin 后台显示为中文,如下:
class Post(models.Model):
...
author = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
verbose_name = '文章'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
同样地,这里通过 verbose_name 来指定对应的 model 在 admin 后台的显示名称,这里 verbose_name_plural 用来表示多篇文章时的复数显示形式。英语中,如果有多篇文章,就会显示为 Posts,表示复数,中文没有复数表现形式,所以定义为和 verbose_name一样。
五 类视图(官方推荐姿势)
5.1 使用方法
视图函数:
blog/views.py
from .models import Post
def index(request):
post_list = Post.objects.all()
return render(request, 'blog/index.html', context={'post_list': post_list})
blog/urls.py配置:
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.index, name='index'),
]
将试图函数转为类视图:
blog/views.py
from django.views.generic import ListView
class IndexView(ListView):
model = Post
template_name = 'blog/index.html'
context_object_name = 'post_list'
- ListView 从数据中获取某个模型列表数据
- model:将 model 指定为 Post,告诉 django 我要获取的模型是 Post
- template_name:指定这个视图渲染的模板。
- context_object_name:指定获取的模型列表数据保存的变量名,这个变量会被传递给模板
blog/urls.py
from . import views
urlpatterns = [
# path('', views.index, name='index'),
path('',views.IndexView.as_view(),name = 'index'),
]