Django中Admin管理与权限管理(二)————模型的完善

模型在默认管理中的完善
1.完善模型
在附录1中我们只是新建了一个简单的模型,只包括标题和内容。在实际的运行环境中该模型是不可能这么简单的。所以我们下面对这个模型先进行一个简单的扩展。扩展后的内容如下:
# -*- coding: utf-8 -*-
from django.db import models
from accounts.models import FzjUser
import django.utils.timezone as timezone
# Create your models here.
# add by chr 20160719
# 定义通知的类型
NoticeType_CHOICES = (
    ('zs', u'指示性通知'),
    ('ps', u'批示性通知'),
    ('zz', u'周知性通知'),
    ('hy', u'会议通知'),
    ('rm', u'任免通知'),
)
# 定义Notice模型
class GfzNotice(models.Model):
    title = models.CharField(max_length=50, default='', verbose_name=u'标题')
    type = models.CharField(max_length=10, choices=NoticeType_CHOICES, default='zs',
 verbose_name=u'通知类型')
    content = models.TextField(default='', verbose_name=u'内容')
    date_create = models.DateTimeField(default=timezone.now, verbose_name=u'创建时间')
    date_mod = models.DateTimeField(auto_now=True, verbose_name=u'最后修改时间')
    list_order = models.IntegerField(default='0', verbose_name=u'排序值')
    crate_man = models.ForeignKey(FzjUser, default=1, verbose_name=u'通知发布者')
    class Meta:
        verbose_name_plural = verbose_name = u'通知'
其中NoticeType_CHOICES主要用来存储通知的类型的,现在每个字段后面都加了一个verbose_name,这个主要是用来显示该字段对应的中文说明,在列表和新增、修改页面都会用得到。其中Meta中设置的属性主要用来修改站点管理中显示的名称。
按照这种方式修改后,我们在按照附录1中3所示内容同步下数据库。但在我们生成迁移文件是会出现如下的提示,因为我们notice表中存在了一条记录,但是date_mode我们设计的是自动生成,所以我们需要给它提供一个默认值,如下我们提供的是2016-07-19这个值(PS:这种方式加值会报错,这里要使用timezon.now()或者2016/7/19来解决这个问题)。

Django中Admin管理与权限管理(二)————模型的完善_第1张图片
2.Notice管理页面
接下来我们就可以看到对应页面内容的修改情况了。
1.站点管理
如下图所示,我们在站点管理中就可以清晰的看到‘通知’这一个中文子项了,但是栏目名称还是英文的Notice,后面会给大家介绍这个的修改方式。

Django中Admin管理与权限管理(二)————模型的完善_第2张图片
2.新增页面
这是我们就可以看到新增的页面已经变得相对完善了,包括通知类型、创建时间、排序值、发布者等。

Django中Admin管理与权限管理(二)————模型的完善_第3张图片
3.列表页面
下图显示的是通知的列表页面,但是和我们实际想要的效果还是相差了不少,后面还是会给大家详细介绍这部分的完善的,所以不着急。
Django中Admin管理与权限管理(二)————模型的完善_第4张图片

4.修改页面
这是修改的页面,就与我们预期想要达到的页面差不多了,具体的样式效果如下所示。
Django中Admin管理与权限管理(二)————模型的完善_第5张图片

3.完善__init__.py中的内容
通过前面的修改后,我们发现站点管理中,栏目显示的还是notice,这是我们需要修改__init__.py文件来显示中文的站点名称。
在__init__.py中添加如下所示的内容,注意修改VERBOSE_APP_NAME为自己需要设计的中文名称即可。
# -*- coding: utf-8 -*-
from os import path
from django.apps import AppConfig
# add by chr 20160719
VERBOSE_APP_NAME = u"通知管理"
def get_current_app_name(file):
    return path.dirname(file).replace('\\', '/').split('/')[-1]
class AppVerboseNameConfig(AppConfig):
    name = get_current_app_name(__file__)
    verbose_name = VERBOSE_APP_NAME
default_app_config = get_current_app_name(__file__) + '.__init__.AppVerboseNameConfig'
好,这时我们就可以看到栏目的内容已经更新成了通知管理。
Django中Admin管理与权限管理(二)————模型的完善_第6张图片

4.完善Admin.py中的内容
在admin.py中添加如下的内容:
# -*- coding: utf-8 -*-
from django.contrib import admin
from notice.models import GfzNotice
# Register your models here.
# add by chr 20160719
class GfzNoticeAdmin(admin.ModelAdmin):
    fieldsets = (
        (u'通知信息', {'fields': ('title', 'type', 'content')}),
        (u'时间信息', {'fields': ('date_create', )}),
        (u'其他信息', {'fields': ('list_order', 'crate_man')}),
    )
    add_fieldsets = (
        (u'通知信息', {'fields': ('title', 'type', 'content')}),
        (u'时间信息', {'fields': ('date_create', )}),
        (u'其他信息', {'fields': ('list_order', 'crate_man')}),
    )
    search_fields = ('title', 'content')
    list_filter = ('type', 'crate_man', 'date_create', 'date_mod')
    list_display = ('title', 'type', 'crate_man', 'date_create', 'date_mod', 'list_order')
    ordering = ('list_order',)
admin.site.register(GfzNotice, GfzNoticeAdmin)
其中GfzNoticeAdmin是我们自定义的一个在Admin中显示和控制的类,这个类继承自admin.ModelAdmin,其中fieldsets用来自定义编辑页面显示的内容,add_fieldsets用来定义新增页的页面信息,search_fields用来定义可以搜索的内容,list_filter用来定义列表中筛选器显示的元素,list_display用来定义列表显示的元素内容,ordering用来定义默认排序的元素。最下面的操作时,把我们自定义的显示类和GfzNotice模型进行绑定后注册。
完成上面操作后不需要更新数据库!这里只是对页面控制的更改。接下来可以看到附录2的5中所示的新页面的信息了。
5.完善后的通知管理页面
1.列表页面
这里我们就可以看到通知的列表页面所示内容,与我们想要的效果差不多了。当然啦,后面也可以根据具体需求来修改相关的页面内容,这里就不再进行赘述了。
Django中Admin管理与权限管理(二)————模型的完善_第7张图片

2.新增页面
如下图就是我们新增通知的页面了,主要分成了通知信息、时间信息、其他信息三个栏目,基本达到了我们初期想要的功能效果了。
Django中Admin管理与权限管理(二)————模型的完善_第8张图片

3.修改页面
修改通知的页面就如下所示,因为我们在admin.py中的设计与新增一样,所以页面看起来是 一样的,只不过这里传了“通知1”的内容
Django中Admin管理与权限管理(二)————模型的完善_第9张图片

4.小元素修改
细心的你,肯定会发现我们对通知的操作的log中存到对象一直是GfzNotice object,这样用户肯定是看不懂的。
Django中Admin管理与权限管理(二)————模型的完善_第10张图片

所以我们需要修改Model.py中的GfzNotice类,修改内容如下:
# 定义Notice模型
class GfzNotice(models.Model):
    ...
    def __str__(self):
        return self.title
就是在Notice而模型中重写下__str__的函数,让生成的str显示的是通知的标题,这样用户就可以明显的看出操作的内容了。
6.小结
通过第二部分给大家的介绍,我们已经可以通过后台的admin来完成对GfzNotice这个模型的修改完善。使其在admin后台管理中的实现效果和我们预期的达成了一致。接下我们需要了解的就是权限的设置和鉴权的过程了,这部分请参考第三部分。

你可能感兴趣的:(Django)