05_管理站点与博客URLs
Django 自带有一个功能全面的管理后台,这也是 Django 可以作为敏捷开发框架的因素之一。 默认的管理站点入口URL都是 /admin/,从 proj/urls.py 里面可以看出。
Step1、管理站点
如果需要在管理站点能管理模型,那么需要将模型注册到这个管理站点来,默认情况下,管理站点仅仅注册了 User 和 Group 两个模型。
注册前管理站点页面如下图:
注册前的首页
注册模型到管理站点的代码主要书写在 docspace/admin.py 文件中,下面写一个比较通用的将当前所有的模型都注册到管理站点来。
# `docspace/admin.py`
from django.contrib import admin
from django.db import models
from django.conf import settings
from django.apps import apps
# Register your models here.
app_label, model_name = getattr(settings, 'AUTH_USER_MODEL').split('.')
User = apps.get_model(app_label=app_label, model_name=model_name)
try:
# app_models = apps.get_app_config('docspace').get_models()
app_models = apps.get_models()
except Exception:
app_models = None
def get_fk_search_fileds(model):
exclude = [
f.name for f in opts.fields if getattr(f, 'choices') and not f.blank
]
_fields = model._meta.fields
fields = []
for f in _fields:
if isinstance(f,
(models.CharField, models.SlugField, models.TextField)
) and f.name not in exclude:
fields.append(f.name)
return fields
if app_models:
exclude_fields = ['creator', 'actived', 'modified', 'operator', 'password']
for model in app_models:
if not admin.site.is_registered(model):
opts = model._meta
list_filter = []
search_fields = []
filter_horizontal = tuple()
for f in opts.get_fields():
if f.name in exclude_fields:
continue
if isinstance(
f, (models.BooleanField, models.NullBooleanField)):
list_filter.append(f.name)
if getattr(f, 'flatchoices', None):
list_filter.append(f.name)
if isinstance(f, (models.CharField, models.SlugField)):
search_fields.append(f.name)
if isinstance(f, models.ForeignKey):
if not isinstance(f.related_model, models.Model):
continue
fk_search_fields = get_fk_search_fileds(f.related_model)
if fk_search_fields:
fk_fields = map(
lambda x: f.name + '__' + x, fk_search_fields
)
search_fields.extend(list(fk_fields))
if isinstance(f, models.ManyToManyField):
filter_horizontal += (f.name,)
exclude_fields.extend(list_filter)
options = {
'list_display': [
f.name for f in opts.fields if f.name not in exclude_fields
],
'list_filter': list_filter,
'search_fields': search_fields,
'list_per_page': 20,
'filter_horizontal': filter_horizontal,
}
try:
admin.site.register(model, **options)
except BaseException as e:
raise(e)
get_fk_search_fileds 方法返回外键的非空且非 choices 的 CharField, SlugField, TextField 3个类型的字段
exclude_fields 排除的字段,不搜索,不过滤,不在列表中显示等
app_models = apps.get_app_config('docspace').get_models() 可以单独获取 docspace 这个 app 下的模型进行注册
list_display 列表展示的字段
list_filter 列表中右侧可过来的字段
search_fields 可以搜索的字段
list_per_page 列表每页默认显示多少条记录
filter_horizontal 多对多字段在表单中用 horizontal 的样式展现
下面是注册后的几个页面:
注册后的首页
新建文章页
Step2、博客URLs
URL 又称统一资源定位器,一个 url 可以定位一个特定的页面,但一个页面可以对应多个 url 也是可以的。
对于个人博客来说,一个站点的 URL 结构确定下来之后尽可能不要再修改,以避免影响博客的 SEO 。
因此,我们在一开始的时候就要确定好博客的 URL 结构。 下面就个人博客的各种页面来设计 URL 结构。
页面名称 URL地址 页面类型
首页 / 列表页面
新建页面 /new/article/ 新建表单页
编辑页面 /edit/article// 修改表单页
删除确认页 /delete/article// 删除确认页
博客内容页面 /// 对象详情页
分类页面 /category// 列表页面
标签页面 /tag// 列表页面
搜索结果页 /?search= 列表页面
归档页面 /archives/ 列表页面
作者页面 /author// 列表页面
RSS 地址页 /feed/ RSS 页面
用户登录页 /accounts/login/ 用户登录页
用户登出页 /accounts/login/ 用户登出页
一些次要的 url 暂时可以通过 admin 站点访问,例如登入登出,分类或标签的 CURD 页面等等都可以通过上面注册的 admin 管理站点进行管理。
实现以上 URLs 的页面,我们的博客基本就可以运作起来了。
/// 博客内容页会衍生出例如:
/article/
/page/
/tutorial/ 等根据 ArticleTypeItems 生成的页面
博客的 URLs 内容就到这里,往后的文章会根据这个 URL 结构开始书写 View 视图的逻辑业务。如若在书写 view 的过程中需要改变 URL 结构会在当时提出来。
下一篇文章将开始视图和模板内容:《Django 个人博客教程-05:视图与模板》。
系列文章:
《Django 个人博客教程-00:开篇》
《Django 个人博客教程-01:开发环境与项目初始化》
《Django 个人博客教程-02:自定义字段与模型抽象类》
《Django 个人博客教程-03:用户模型和博客链接》
《Django 个人博客教程-04:文章模型和评论模型》
《Django 个人博客教程-05:管理站点与博客URLs》当前文章
《Django 个人博客教程-06:视图与模板》下一篇
欢迎分享给其他人或点击在看