天天看點

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管理與權限管理(二)————模型的完善

2.Notice管理頁面

接下來我們就可以看到對應頁面内容的修改情況了。

1.站點管理

如下圖所示,我們在站點管理中就可以清晰的看到‘通知’這一個中文子項了,但是欄目名稱還是英文的Notice,後面會給大家介紹這個的修改方式。

Django中Admin管理與權限管理(二)————模型的完善

2.新增頁面

這是我們就可以看到新增的頁面已經變得相對完善了,包括通知類型、建立時間、排序值、釋出者等。

Django中Admin管理與權限管理(二)————模型的完善

3.清單頁面

下圖顯示的是通知的清單頁面,但是和我們實際想要的效果還是相差了不少,後面還是會給大家詳細介紹這部分的完善的,是以不着急。

Django中Admin管理與權限管理(二)————模型的完善

4.修改頁面

這是修改的頁面,就與我們預期想要達到的頁面差不多了,具體的樣式效果如下所示。

Django中Admin管理與權限管理(二)————模型的完善

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管理與權限管理(二)————模型的完善

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管理與權限管理(二)————模型的完善

2.新增頁面

如下圖就是我們新增通知的頁面了,主要分成了通知資訊、時間資訊、其他資訊三個欄目,基本達到了我們初期想要的功能效果了。

Django中Admin管理與權限管理(二)————模型的完善

3.修改頁面

修改通知的頁面就如下所示,因為我們在admin.py中的設計與新增一樣,是以頁面看起來是 一樣的,隻不過這裡傳了“通知1”的内容

Django中Admin管理與權限管理(二)————模型的完善

4.小元素修改

細心的你,肯定會發現我們對通知的操作的log中存到對象一直是GfzNotice object,這樣使用者肯定是看不懂的。

Django中Admin管理與權限管理(二)————模型的完善

是以我們需要修改Model.py中的GfzNotice類,修改内容如下:

# 定義Notice模型

class GfzNotice(models.Model):

    ...

    def __str__(self):

        return self.title

就是在Notice而模型中重寫下__str__的函數,讓生成的str顯示的是通知的标題,這樣使用者就可以明顯的看出操作的内容了。

6.小結

通過第二部分給大家的介紹,我們已經可以通過背景的admin來完成對GfzNotice這個模型的修改完善。使其在admin背景管理中的實作效果和我們預期的達成了一緻。接下我們需要了解的就是權限的設定和鑒權的過程了,這部分請參考第三部分。