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:视图与模板》下一篇 欢迎分享给其他人或点击在看