• Django:(博客系统)使用使用mysql数据->后台管理tag/post/category的配置


      Django后台一般是不需要人为的去开发的,因为django已经通过配置实现哪些模块是后台需要管理,如何排序,列表展示哪些列,列显示名称,是否为空(默认值),过滤条件,分页页数,列表中哪些项可编辑等等。

      那么具体如何针对上一篇文章《Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中》中的tag/post/category模型进行修改配置来实现呢?可以参考django官网文章:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overview

      Django自动管理工具是django.contrib的一部分。django.contrib是一套庞大的功能集,它是Django基本代码的组成部分,Django框架就是由众多包含附加组件(add-on)的基本代码构成的。 你可以把django.contrib看作是可选的Python标准库或普遍模式的实际实现。 它们与Django捆绑在一起,这样你在开发中就不用“重复发明轮子”了。

      管理工具是本书讲述django.contrib的第一个部分。从技术层面上讲,它被称作django.contrib.admin。django.contrib中其它可用的特性,如用户鉴别系统(django.contrib.auth)、支持匿名会话(django.contrib.sessioins)以及用户评注系统(django.contrib.comments)。这些,我们将在第十六章详细讨论。在成为一个Django专家以前,你将会知道更多django.contrib的特性。 目前,你只需要知道Django自带很多优秀的附加组件,它们都存在于django.contrib包里。

    激活管理界面

    Django管理站点完全是可选择的,因为仅仅某些特殊类型的站点才需要这些功能。 这意味着你需要在你的项目中花费几个步骤去激活它。

    第一步,对你的settings文件做如下这些改变: 

    1. 'django.contrib.admin'加入setting的INSTALLED_APPS配置中 (INSTALLED_APPS中的配置顺序是没有关系的, 但是我们喜欢保持一定顺序以方便人来阅读)

    1. 保证INSTALLED_APPS中包含'django.contrib.auth''django.contrib.contenttypes''django.contrib.sessions',Django的管理工具需要这3个包。 (如果你跟随本文制作mysite项目的话,那么请注意我们在第五章的时候把这三项INSTALLED_APPS条目注释了。现在,请把注释取消。)

    1. 确保MIDDLEWARE_CLASSES 包含'django.middleware.common.CommonMiddleware''django.contrib.sessions.middleware.SessionMiddleware''django.contrib.auth.middleware.AuthenticationMiddleware' 。

    运行 python manage.py syncdb (

    Django 1.7.1及以上 用以下命令
    # 1. 创建更改的文件
    python manage.py makemigrations
    # 2. 将生成的py文件应用到数据库
    python manage.py migrate
    
    旧版本的Django 1.6及以下用
    python manage.py syncdb

    )。这一步将生成管理界面使用的额外数据库表。 当你把'django.contrib.auth'加进INSTALLED_APPS后,第一次运行syncdb命令时, 系统会请你创建一个超级用户。 如果你不这么作,你需要运行python manage.py createsuperuser来另外创建一个admin的用户帐号,否则你将不能登入admin (提醒一句: 只有当INSTALLED_APPS包含'django.contrib.auth'时,python manage.py createsuperuser这个命令才可用.)

    第三,将admin访问配置在URLconf(记住,在urls.py中). 默认情况下,命令django-admin.py startproject生成的文件urls.py是将Django admin的路径注释掉的,你所要做的就是取消注释。 请注意,以下内容是必须确保存在的:

    # Include these import statements...
    from django.contrib import admin
    admin.autodiscover()
    
    # And include this URLpattern...
    urlpatterns = patterns('',
        # ...
        (r'^admin/', include(admin.site.urls)),
        # ...
    )

    当这一切都配置好后,现在你将发现Django管理工具可以运行了。 启动开发服务器(如前:`` python manage.py runserver`` ),然后在浏览器中访问:http://127.0.0.1:8000/admin/

    要了解更多内容,请参考:《第六章 Django站点管理

    如何建tag/post/category实现后台自动管理功能?

    如果想让后台自动管理只需要在blogadmin.py中添加如下代码即可:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    from django.contrib import admin
    from models import Tag
    from models import Post
    from models import Category
    
    class PostAdmin(admin.ModelAdmin):
        list_display = ['title', 'category', 'author', 'create_time', 'modify_time']
    
    class TagAdmin(admin.ModelAdmin):
        list_display = ['name', 'create_time', 'modify_time']
    
    class CategoryAdmin(admin.ModelAdmin):
        list_display = ['name', 'create_time', 'modify_time']
    
    admin.site.register(Tag, TagAdmin)
    admin.site.register(Post, PostAdmin)
    admin.site.register(Category, CategoryAdmin)

    登录后台查看效果:

    设置文章字段显示名称、排序、分页、筛选字段:

    经过上边设置了后台管理,及设置了后台列表展示字段效果如下:

    但是这样貌似不是特别美观,没有分页、没有搜索、没有默认排序、不可以在列表中修改category、没有按照发布日期搜索、及文章分类搜索功能,那么如何实现呢?

    1)字段中文设置:

    需要修改models.py中字段显示别名:

    # coding:utf-8
    from __future__ import unicode_literals
    from django.db import models
    from django.contrib.auth.admin import User
    # '''
    # 文章栏目(分类)实体
    # '''
    @python_2_unicode_compatible
    class Category(models.Model):
        name = models.CharField(u'文章栏目', max_length=128)  # 文章栏目(分类)名称
        create_time = models.DateTimeField(u'创建时间', auto_now_add=True, editable=False)  # 创建时间
        modify_time = models.DateTimeField(u'修改时间', auto_now=True, null=True)  # 修改时间
    
        def __str__(self):
            return self.name
    
    # '''
    # 文章标签实体
    # '''
    @python_2_unicode_compatible
    class Tag(models.Model):
        name = models.CharField(u'文章标签', max_length=128)  # 文章标签名称
        create_time = models.DateTimeField(u'创建时间', auto_now_add=True, editable=False)  # 创建时间
        modify_time = models.DateTimeField(u'修改时间', auto_now=True, null=True)  # 修改时间
    
        def __str__(self):
            return self.name
    
    
    # """
    # 文章实体
    # """
    @python_2_unicode_compatible
    class Post(models.Model):
        title = models.CharField(u'标题', max_length=128)  # 文章标题,定义最大长度为128
        '''
        如果不使用blank=True标识,则当该值为空时会保存操作会抛出异常
        '''
        summary = models.CharField(verbose_name=u'简介', max_length=256, blank=True)  # 文章简介,定义最大长度为126。, type=models.CharField
        body = models.TextField(verbose_name=u'内容')  # 文章内容,较长因此定义为TextField, type=models.TextField
        create_time = models.DateTimeField(u'创建时间', auto_now_add=True, editable=True)  # 文章创建时间
        modify_time = models.DateTimeField(u'修改时间', auto_now=True, null=True)  # 文章修改时间
        views = models.PositiveIntegerField(default=0, verbose_name='阅读数')  # 文章阅读数量,默认为0
        '''
        一篇文章只能归属一个栏目,而一个栏目下可能会拥有多篇文章,因此这是一对多的关联关系。
        关于用法请阅读:https://docs.djangoproject.com/en/1.10/topics/db/models/#relationships
        '''
        category = models.ForeignKey(Category, verbose_name='分类')  # 文章分类
        '''
        一篇文章允许有多个标签,一个标签允许被多篇文章使用,因此他们的关系是多对多关系,但是同时该值可以不设置,因此使用black=True标识该字段允许为空。
        '''
        tags = models.ManyToManyField(Tag, verbose_name='标签', blank=True)  # 文章标签
        '''
        # 由于django.contrib.auth 是 Django 内置的应用,它用于处理网站用户的注册、登录等流程,User 是 Django 为我们已经写好的用户模型。
        #一篇文章对应一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。
        '''
        author = models.ForeignKey(User, verbose_name='作者')  # 文章作者
    
        def __str__(self):
            return self.title
    
        def __unicode__(self):
            return self.title

    2)设置文章筛选过滤、分页、搜索字段、默认排序、列表中可编辑category、快速筛选(发布时间、文章分类)

    修改blogadmin.py

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    from django.contrib import admin
    from models import Tag
    from models import Post
    from models import Category
    
    
    class PostAdmin(admin.ModelAdmin):
        list_display = ['title', 'category', 'author', 'create_time', 'modify_time']#设置列表显示字段
        search_fields = ('title',)                                                  #设置搜索字段
        list_filter = ('category','create_time',)                                   #设置按照发布时间、分类快速筛选
        list_per_page = 10                                                          #设置分页
        list_editable = ['category', ]                                              #设置列表可编辑列
    
    class TagAdmin(admin.ModelAdmin):
        list_display = ['name', 'create_time', 'modify_time']
        search_fields = ('name',)
    
    class CategoryAdmin(admin.ModelAdmin):
        list_display = ['name', 'create_time', 'modify_time']
        search_fields = ('name',)
    
    admin.site.register(Tag, TagAdmin)
    admin.site.register(Post, PostAdmin)
    admin.site.register(Category, CategoryAdmin)

    效果:

  • 相关阅读:
    给刚工作不久的程序猿同学的一封信
    Java进阶篇设计模式之六 ----- 组合模式和过滤器模式
    Java进阶篇设计模式之五-----外观模式和装饰器模式
    Java进阶篇设计模式之四 -----适配器模式和桥接模式
    Java进阶篇设计模式之三 ----- 建造者模式和原型模式
    SpringBoot简单打包部署(附工程)
    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)【转载】
    Eclipse快捷键大全(转载)
    在redis一致性hash(shard)中使用lua脚本的坑
    如何评价微软Connect 2015?[转载]
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/7589751.html
Copyright © 2020-2023  润新知