Django Jet文檔

關(guān)于
JET是新式的Django管理界面并且增強了功能。

內(nèi)容

文檔
<ul>
<li>開始
<ul>
<li>安裝django-jet
<li>安裝儀表盤
</ul>
<li>配置
<ul>
<li>配置文件
<li>自動補全
<li>緊湊內(nèi)聯(lián)
<li>過濾器
</ul>
<li>儀表盤
<ul>
<li>自定義儀表盤
<li>儀表盤模塊
<li>自定義儀表盤模塊
</ul>
<li>儀表盤API
<ul>
<li>儀表盤
<li>儀表盤模塊
</ul>
<li>Contributing
<ul><li>要求
<li>反饋Issue/Feature的準(zhǔn)則
<li>貢獻(xiàn)代碼的指南
<li>貢獻(xiàn)翻譯
<li>貢獻(xiàn)css/js/翻譯
<li>貢獻(xiàn)文檔
</ul>
</ul>

許可
Django-JET使用開源(AGPLv3)和商業(yè)兩種性質(zhì)的協(xié)議第练。請注意如果程序中使用AGPLv3協(xié)議的代碼那么您的代碼也應(yīng)符合AGPL許可協(xié)議喘蟆。如果您不想那么做我們可以提供一份商業(yè)性的許可協(xié)議(訪問主頁)溃槐。這份商業(yè)性的許可協(xié)議允許您將Django-JET應(yīng)用于商業(yè)性的產(chǎn)品或應(yīng)用中而不需符合AGPLv3許可酌予。

資源
<ul>
<li>主頁:http://jet.geex-arts.com/
<li>在線Demo:http://demo.jet.geex-arts.com/admin/
<li>libi.io:http://libi.io/library/1683/django-jet
<li>PyPI:https://pypi.python.org/pypi/django-jet
<li>支持: support@jet.geex-arts.com
</ul>

截圖
<ul>
<li>

**Index dashboard**
</li>
<li>
**Changelist**
</li>
<li>
Paste_Image.png
</li></ul>

安裝#

當(dāng)你按照這個教程操作后Django JET儀表盤還不能啟動(因為它位于一個單獨的應(yīng)用中)观游。如果您想使之工作永票,您需要按照安裝儀表盤的步驟啟用儀表盤卵贱。

<ul>
<li>下載最新版本的Django JET

pip install djang-jet
# or
easy_install django-jet

<li>將'jet'應(yīng)用添加到你的Django項目的設(shè)置文件settings.py中的INSTALLED_APPS設(shè)置中(注意'jet'應(yīng)位于'django.contrib.admin'之前)

INSTALLED_APPS = (
        ...
        'jet',
        'django.contrib.admin',
        ...
)

<li> 確認(rèn)在settings.py中啟用了上下文處理器django.template.context_precessors.request(Djang 1.8以上版本)

在django 1.8之前應(yīng)該使用不能的方式指定上下文處理器。即使用django.core.context_preocessor.request代替django.template.context_precessors.request

from django.conf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
        'django.core.context_processors.request',
)

<li>在項目的urls.py文件的urlpatterns中添加url模版(為了關(guān)聯(lián)到相關(guān)路由)

urlpatterns = patterns(
    '',
    url(r'^jet/', include('jet.urls', 'jet')),  # Django JET URLS
    url(r'^admin/', include(admin.site.urls)),
    ...
)

<li> 創(chuàng)建數(shù)據(jù)表

python manage.py migrate jet
# or
python manage.py syncdb

<li> 收集靜態(tài)文件(產(chǎn)品環(huán)境中)
python manage.py collectstatic
<li>清理瀏覽器緩存
</ul>

儀表盤安裝#

儀表盤位于一個單獨的應(yīng)用中侣集。所以當(dāng)完成標(biāo)準(zhǔn)的JET安裝后它還不能工作键俱。需要按照以下步驟啟用儀表盤應(yīng)用:
<ul>
<li>將'jet.dashboard'應(yīng)用添加到你的Django項目的設(shè)置文件settings.py中的INSTALLED_APPS設(shè)置中(注意'jet.dashboard'應(yīng)位于'jet'之前)

INSTALLED_APPS = (
    ...
    'jet.dashboard',
    'jet',
    'django.contrib.admin',
    ...
)

<li>在項目的urls.py文件的urlpatterns中添加url模版(為了關(guān)聯(lián)到相關(guān)路由)

urlpatterns = patterns(
    '',
    url(r'^jet/', include('jet.urls', 'jet')),  # Django JET URLS
    url(r'^jet/dashboard/', include('jet.dashboard.urls', 'jet-dashboard')),  # Django JET dashboard URLS
    url(r'^admin/', include(admin.site.urls)),
    ...
)

<li>安裝python包For Google Analytics widgets only
pip install google-api-python-client==1.4.1
<li>創(chuàng)建數(shù)據(jù)表

python manage.py migrate dashboard
# or
python manage.py syncdb

<li>收集靜態(tài)文件(產(chǎn)品環(huán)境中)
python manage.py collectstatic
</ul>
儀表盤已經(jīng)安裝了。學(xué)習(xí)Dashboard章節(jié)以自定義儀表盤世分。

配置#

配置文件##

配置是指在settings.py中一些可用的選項:

JET_DEFAULT_THEME###

Django JET允許用戶改變默認(rèn)的主題编振。這個特點主要是用來自定義顏色方案而不是制作一個完全不同的主題。這個選項實際上的作用是使Django加載不同的css文件臭埋。

可用的內(nèi)置主題如下:
<ul>
<li>default(默認(rèn))
<li>green(綠色)
<li>light-violet(淺紫色)
<li>light-green(淺綠色)
<li>light-blue(淺藍(lán))
<li>light-gray(淺灰)
</ul>
可以使用參數(shù)改變主題
JET_DEFAULT_THEME = 'light-gray'

JET_THEMES###


可以允許用戶自行改變管理面板的配色方案踪央。這個選項會添加配色方案選擇器到用戶的下拉菜單。如果要禁用這個選項只需使JET_THEMS是一個空的list即可瓢阴。

JET_THEMES = [
    {
        'theme': 'default', # theme folder name
        'color': '#47bac1', # color of the theme's button in user menu
        'title': 'Default' # theme title
    },
    {
        'theme': 'green',
        'color': '#44b78b',
        'title': 'Green'
    },
    {
        'theme': 'light-green',
        'color': '#2faa60',
        'title': 'Light Green'
    },
    {
        'theme': 'light-violet',
        'color': '#a464c4',
        'title': 'Light Violet'
    },
    {
        'theme': 'light-blue',
        'color': '#5EADDE',
        'title': 'Light Blue'
    },
    {
        'theme': 'light-gray',
        'color': '#222',
        'title': 'Light Gray'
    }
]

自定義JET_THEME

可以通過在/static/jet/css/thems/下添加新的文件夾的方式自行添加配色方案畅蹂。你可以使用/jet/static/jet/css/themes/light-violet/文件夾作為一個例子(在Django JET代碼中獲得)。_variables.scss中包含了所有可以自行以的變量荣恐。你需要編譯這個目錄下的所有.scss文件才能使用自己的主題液斜。

菜單壓縮

Compact Or Not

如果您沒有很多的應(yīng)用或者模塊卻顯示二級菜單可能會使您感到厭煩。關(guān)于這點您可以使用菜單的壓縮模式它會在側(cè)邊菜單欄直接顯示應(yīng)用和模塊而不再需要移動鼠標(biāo)到應(yīng)用上而再展示相關(guān)的模塊叠穆。
JET_SIDE_MENU_COMPACT = True
這個選項默認(rèn)為False少漆。

自定義菜單

默認(rèn)情況下JET將應(yīng)用和它的模塊按照字母表的順序展示在側(cè)邊菜單欄。如果您想展示特定的應(yīng)用和模塊或者改變他們的順序則可以使用JET_SIDE_MENU_CUSTOM_APPS來設(shè)置

JET_SIDE_MENU_CUSTOM_APPS = [
   ('core', [ # Each list element is a tuple with application name (app_label) and list of models
       'User',
       'MenuItem',
       'Block',
   ]),
   ('shops', [
       'Shop',
       'City',
       'MetroStation',
   ]),
   ('feedback', [
       'Feedback',
   ]),
]

如果您想展示某個應(yīng)用的所有模塊硼被,可以使用__all__關(guān)鍵字

JET_SIDE_MENU_CUSTOM_APPS = [
    ('core', ['__all__']),
    ...
]

如果有多個管理站點并且想要給不同的站點指定不同的應(yīng)用菜單示损,可以使用站點名稱作為字典的key,將菜單的列表作為value來設(shè)定祷嘶。

可以使用jet _custom_apps_example這個管理命令來生成JET_SIDE_MENU_CUSTOM_APPS的示例屎媳。這個示例中會包括所有的應(yīng)用和模塊。你可以這樣使用它:
python manage.py jet_custom_apps_example

JET_CHANGE_FORM_SIBLING_LINKS

Paste_Image.png

在頁面上添加前進(jìn)或者后退的導(dǎo)航按鈕可以讓您在編輯完成后直接返回而不用先到變更列表论巍。如果這個功能影響到了性能的話可以在設(shè)置中禁用烛谊。
JET_CHANGE_FORM_SIBLING_LINKS = True
默認(rèn)情況下這個選項為True

JET_INDEX_DASHBOARD

設(shè)置管理主頁的儀表盤用到的類。這個特性可以使用戶建立自己的帶有自定義模塊和已經(jīng)安裝的布局的儀表盤嘉汰。
JET_INDEX_DASHBOARD = 'jet.dashboard.dashboard.DefaultIndexDashboard'

JET_APP_INDEX_DASHBOARD

和JET_INDEX_DASHBOARD的功能相同丹禀,但是作用的是應(yīng)用的頁面。

JET_APP_INDEX_DASHBOARD = 'jet.dashboard.dashboard.DefaultAppIndexDashboard'

自動補全

默認(rèn)情況下Django JET會對輸入的查詢條件提供全部可能的選項。當(dāng)存在大量的可用的選項時這個結(jié)果并不一定是您所想要的双泪。為此持搜,Django JET允許您使用AJAX動態(tài)的加載結(jié)果。

配置

為了達(dá)成這個功能您需要做以下的事情:
<ul>
<li>指定需要使用AJAX方式查詢的模塊字段焙矛。將下面這個將可以使用AJAX查詢的字段的字段名作為元組或列表返回的靜態(tài)方法加入的模塊中葫盼。

@staticmethod
def autocomplete_search_fields():
    return 'field1', 'field2'

# for single field

@staticmethod
def autocomplete_search_fields():
    return 'field1',

一個示例:

class Address(models.Model):
    name = models.CharField(_('name'), max_length=255)
    city = models.ForeignKey(City, verbose_name=_('city'), related_name='addresses')
    zip = models.IntegerField(_('zip/postal code'))

    class Meta:
        verbose_name = _('address')
        verbose_name_plural = _('addresses')
        unique_together = ('name', 'city')

    def __str__(self):
        return self.name

    @staticmethod
    def autocomplete_search_fields():
        return 'name', 'city__name'

<li>如果有外鍵關(guān)聯(lián)的話可以使用自定義的AJAX篩選類jet.filters.RelatedFieldAjaxListFilter

from jet.filters import RelatedFieldAjaxListFilter

class PersonAdmin(admin.ModelAdmin):
    list_filter = (
        ...
        ('address', RelatedFieldAjaxListFilter),
    )

<li>現(xiàn)在管理界面所有的選擇框會使用AJAX的方式來查詢并展示可用的選項。
這些是為雙外鍵和多對多關(guān)系的字段所做的村斟。
</ul>

為某些字段去除自動補全

自動補全在大多數(shù)情況下是適用的贫导,但有時你希望限制給某個空間提供的數(shù)據(jù)條數(shù)。這種情況下你可以通過下面這種方式禁用自動補全:

class YourForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(YourForm, self).__init__(*args, **kwargs)
        if SOME_CASE(self.instance):
            self.fields['FIELD_NAME'].autocomplete = False
            self.fields['FIELD_NAME'].queryset = Model.queryset.some_filter()

緊湊內(nèi)聯(lián)

默認(rèn)情況下Django管理界面提供了內(nèi)聯(lián)方式以供用戶在同一頁面編輯相關(guān)聯(lián)的幾種模型-StackedInlineTabularInline蟆盹。在沒有那么多對象時大部分使用的都是StackedInline的方式孩灯。如果相關(guān)聯(lián)的模型很多,TabularInline可以幫助到您逾滥,但是當(dāng)相關(guān)聯(lián)的模型有很多字段的話并不方便關(guān)聯(lián)他們峰档。為了解決這個問題JET內(nèi)置了CompactInline類。

Paste_Image.png

用法

CompactInline的工作方式就像Django內(nèi)置的內(nèi)聯(lián)方式一樣寨昙。只需要繼承自jet.admin.CompactInline內(nèi)聯(lián)類即可讥巡。

from django.contrib import admin
from people.models import County, State, City
from jet.admin import CompactInline


class StateCountiesInline(admin.TabularInline):
    model = County
    extra = 1
    show_change_link = True


class StateCitiesInline(CompactInline):
    model = City
    extra = 1
    show_change_link = True


class StateAdmin(admin.ModelAdmin):
    inlines = (StateCountiesInline, StateCitiesInline)

過濾器

RelatedFieldAjaxListFilter

參見Autocomplete文檔

django-admin-rangefilter

為了糾正django-admin-rangefilter包的兼容性問題,你需要使用JET的過濾器管理類jet.filter.DateRangeFilter來代替rangefilter.filter.DateRangeFilter

#from rangefilter.filter import DateRangeFilter
from jet.filters import DateRangeFilter


class MyUserAdmin(UserAdmin):
    ...
    list_filter = (
        ('date_joined', DateRangeFilter),
    )

儀表盤

自定義儀表盤

Django JETDashboard盡可能的與django-admin -tools dashboard兼容以使django-admin-tools模塊移植到Django JET上舔哪。大多數(shù)情況下可以在模塊的模版中更改python的導(dǎo)入和移除之前的繼承尚卫。
Dashboard相當(dāng)于Dashboard類的實例,DashboardModule是其的子類尸红。所有的自定義Dashboard應(yīng)當(dāng)繼承jet.dashboard.dashboard.Dashboard并且使用init_with_context來填充控件。你應(yīng)該將你的控件添加到childrenavailable_children屬性
進(jìn)行下面的步驟之前要先確認(rèn)您已安裝了Dashboard

開始自定義Dashboard

<ul>
<li>在合適的位置創(chuàng)建dashboard.py文件(例如項目的根目錄下)刹泄,編輯一下內(nèi)容

from django.utils.translation import ugettext_lazy as _
from jet.dashboard import modules
from jet.dashboard.dashboard import Dashboard, AppIndexDashboard


class CustomIndexDashboard(Dashboard):
    columns = 3

    def init_with_context(self, context):
        self.available_children.append(modules.LinkList)
        self.children.append(modules.LinkList(
            _('Support'),
            children=[
                {
                    'title': _('Django documentation'),
                    'url': 'http://docs.djangoproject.com/',
                    'external': True,
                },
                {
                    'title': _('Django "django-users" mailing list'),
                    'url': 'http://groups.google.com/group/django-users',
                    'external': True,
                },
                {
                    'title': _('Django irc channel'),
                    'url': 'irc://irc.freenode.net/django',
                    'external': True,
                },
            ],
            column=0,
            order=0
        ))

<li>將settings.py文件的路徑添加到創(chuàng)建的dashboard.py文件中(假設(shè)dashboard.py在項目根目錄下)

JET_INDEX_DASHBOARD = 'dashboard.CustomIndexDashboard'

現(xiàn)在您有了一個只有一個LinkList控件的dashboard外里。如果您有另外一個dashboard并且已經(jīng)渲染完成的話您需要重啟dashboard。訪問Dashboard Modules學(xué)習(xí)其他可以應(yīng)用于自定義dashboard的組件或者從Custom Dashboard Module建立自己的控件特石。

Dashboard Modules

內(nèi)置的Dashboard Modules

LinkList

Paste_Image.png
class jet.dashboard.modules.LinkList(title=None, children=[], **kwargs)

用法

from django.utils.translation import ugettext_lazy as _
from jet.dashboard import modules
from jet.dashboard.dashboard import Dashboard, AppIndexDashboard


class CustomIndexDashboard(Dashboard):
    columns = 3

    def init_with_context(self, context):
        self.available_children.append(modules.LinkList)
        self.children.append(modules.LinkList(
            _('Support'),
            children=[
                {
                    'title': _('Django documentation'),
                    'url': 'http://docs.djangoproject.com/',
                    'external': True,
                },
                {
                    'title': _('Django "django-users" mailing list'),
                    'url': 'http://groups.google.com/group/django-users',
                    'external': True,
                },
                {
                    'title': _('Django irc channel'),
                    'url': 'irc://irc.freenode.net/django',
                    'external': True,
                },
            ],
            column=0,
            order=0
        ))

children = []

children的屬性包括鏈接盅蝗,你可以把他作為參數(shù)傳到構(gòu)造器中以制作你自己的原裝的鏈表。
children是一個字典的數(shù)組

[
     {
         'title': _('Django documentation'),
         'url': 'http://docs.djangoproject.com/',
         'external': True,
     },
     ...
]

layout = 'stacked'

指定控件的布局姆蘸,允許值為stackedinline

AppList

Paste_Image.png

class jet.dashboard.modules.AppList(title=None, model=None, context=None, **kwargs)

展示應(yīng)用和其包含的模塊以及鏈接墩莫。每個模塊有響應(yīng)的“創(chuàng)建”和“更改”鏈接
例子:

from django.utils.translation import ugettext_lazy as _
from jet.dashboard import modules
from jet.dashboard.dashboard import Dashboard, AppIndexDashboard


class CustomIndexDashboard(Dashboard):
    columns = 3

    def init_with_context(self, context):
        self.children.append(modules.AppList(
            _('Applications'),
            exclude=('auth.*',),
            column=0,
            order=0
        ))

exclude = None

指定不展示的模塊,exclude是一個形如app_label.model的字符串的數(shù)組逞敷。支持用*來代表所有模塊(auto.**)

models = None
同exclude

ModelList

Paste_Image.png

class jet.dashboard.modules.ModelList(title=None, model=None, context=None, **kwargs)

展示模塊以及鏈接狂秦。每個模塊有響應(yīng)的“創(chuàng)建”和“更改”鏈接
例子:

from django.utils.translation import ugettext_lazy as _
from jet.dashboard import modules
from jet.dashboard.dashboard import Dashboard, AppIndexDashboard


class CustomIndexDashboard(Dashboard):
    columns = 3

    def init_with_context(self, context):
        self.children.append(modules.ModelList(
            _('Models'),
            exclude=('auth.*',),
            column=0,
            order=0
        ))

exclude = None

指定不展示的木塊,同AppList的exclude

models = None

同上

RecentActions

Paste_Image.png

class jet.dashboard.modules.RecentActions(title=None, limit=10, **kwargs)

展示最近的管理操作推捐,包含實體名裂问,操作類型,操作人,日期
例子:

from django.utils.translation import ugettext_lazy as _
from jet.dashboard import modules
from jet.dashboard.dashboard import Dashboard, AppIndexDashboard


class CustomIndexDashboard(Dashboard):
    columns = 3

    def init_with_context(self, context):
        self.children.append(modules.RecentActions(
            _('Recent Actions'),
            10,
            column=0,
            order=0
        ))

exclude_list = None

不展示的模塊堪簿,同AppList的exclude

include_list = None

同上

limit = 10

展示條數(shù)

Feed

Paste_Image.png

class jet.dashboard.modules.Feed(title=None, feed_url=None, limit=None, **kwargs)

展示訂閱資訊以及以下信息:記錄標(biāo)題痊乾,日期,到完整內(nèi)容的鏈接
例子:

from django.utils.translation import ugettext_lazy as _
from jet.dashboard import modules
from jet.dashboard.dashboard import Dashboard, AppIndexDashboard


class CustomIndexDashboard(Dashboard):
    columns = 3

    def init_with_context(self, context):
        self.children.append(modules.Feed(
            _('Latest Django News'),
            feed_url='http://www.djangoproject.com/rss/weblog/',
            limit=5,
            column=0,
            order=0
        ))

feed_url = None

訂閱資訊的url(用戶可自行修改)

limit = None

展示條數(shù)

Google Analytics Widgets

需要另外安裝Google Analytics控件

Paste_Image.png

安裝

<ul>
<li>安裝Python包
pip install google-api-python-client==1.4.1
<ul>指定到Google Analytics client_secrets.json的路徑(從Google獲得)

JET_MODULE_GOOGLE_ANALYTICS_CLIENT_SECRETS_FILE = os.path.join(PROJECT_DIR, 'client_secrets.json')

<li>在urls.py文件的開頭導(dǎo)入包

from jet.dashboard.dashboard_modules import google_analytics_views

</ul>
例子:

from django.utils.translation import ugettext_lazy as _
from jet.dashboard.dashboard import Dashboard, AppIndexDashboard
from jet.dashboard.dashboard_modules import google_analytics


class CustomIndexDashboard(Dashboard):
    columns = 3

    def init_with_context(self, context):
       self.available_children.append(google_analytics.GoogleAnalyticsVisitorsTotals)
       self.available_children.append(google_analytics.GoogleAnalyticsVisitorsChart)
       self.available_children.append(google_analytics.GoogleAnalyticsPeriodVisitors)

Yandex Metrika Widgets

Yandex Metrika Widgets需要額外安裝

Paste_Image.png

安裝

<ul>
<li>設(shè)置 Yandex Metrika的CLIENT_ID和CLIENT_SECRET(從 Yandex Metrika的網(wǎng)站獲得)

JET_MODULE_YANDEX_METRIKA_CLIENT_ID = 'YANDEX_METRIKA_CLIENT_ID'
JET_MODULE_YANDEX_METRIKA_CLIENT_SECRET = 'YANDEX_METRIKA_CLIENT_SECRET'

<li>在urls.py文件中導(dǎo)入包

from jet.dashboard.dashboard_modules import yandex_metrika_views

例子

from django.utils.translation import ugettext_lazy as _
from jet.dashboard.dashboard import Dashboard, AppIndexDashboard
from jet.dashboard.dashboard_modules import yandex_metrika


class CustomIndexDashboard(Dashboard):
    columns = 3

    def init_with_context(self, context):
       self.available_children.append(yandex_metrika.YandexMetrikaVisitorsTotals)
       self.available_children.append(yandex_metrika.YandexMetrikaVisitorsChart)
       self.available_children.append(yandex_metrika.YandexMetrikaPeriodVisitors)

class jet.dashboard.dashboard_modules.yandex_metrika.YandexMetrikaVisitorsTotals(title=None, period=None, **kwargs)

Yandex Metrika 控件可以展示一段特定時期的訪問人數(shù)椭更。時間區(qū)間可以是今天哪审、上周、上月虑瀑、上季度湿滓、上一年等。

period = None

展示的時間區(qū)間缴川,允許值為表示天數(shù)的整數(shù)

class jet.dashboard.dashboard_modules.yandex_metrika.YandexMetrikaVisitorsChart(title=None, period=None, show=None, group=None, **kwargs)

展示特定時間區(qū)間的訪客/觀眾等人數(shù)的圖表茉稠。

group=None

設(shè)置數(shù)據(jù)的單位,可能的值為day/week/month

period=None

天數(shù)的整數(shù)值

show=None

展示的數(shù)據(jù)把夸,可能值為visitors/visits/page_views

class jet.dashboard.dashboard_modules.yandex_metrika.YandexMetrikaPeriodVisitors(title=None, period=None, group=None, **kwargs)

和上一個差不多:)

自定義Dashboard Module

按照以下步驟來創(chuàng)建你自己的dashboard module
<ul>
<li>繼承Dashboard Module
<li>創(chuàng)建模塊模版
<li>(可選)添加模塊視圖
</ul>
當(dāng)然您也可以參照代碼中在jet/dashboard/modules.py和jet/dashboard/dashboard_modules/位置內(nèi)置的模塊而线。

繼承Dashboard Module

<ul>
<li>在你的django應(yīng)用中創(chuàng)建dashboard modules文件dashboard_modules.py(或者其他名字)
<li>在創(chuàng)建的文件中創(chuàng)建dashboard modules類并繼承dashboard module類。從http://jet.readthedocs.io/en/latest/dashboard_api.html#dashboard-module查看可用的模塊屬性恋日。init_with_context方法相當(dāng)于控件的構(gòu)造方法膀篮,可以用來加載數(shù)據(jù)和穿實話模塊的狀態(tài)。你可以將數(shù)據(jù)存儲到模塊的字段中并傳到模版中岂膳。
例子(dashboard_modules.py)

from jet.dashboard.modules import DashboardModule
from contact.models import Ticket


class RecentTickets(DashboardModule):
    title = 'Recent tickets'
    title_url = Ticket.get_admin_changelist_url()
    template = 'contact/dashboard_modules/recent_tickets.html'
    limit = 10

    def init_with_context(self, context):
        self.children = Ticket.objects.order_by('-date_add')[:self.limit]

<li>可選的誓竿,您可以在管理界面添加可自定義的設(shè)置和內(nèi)容。為自定義設(shè)置的settings_form應(yīng)設(shè)置谈截,實現(xiàn)settings_dictload_settings方法筷屡。如要自定義內(nèi)容的話應(yīng)該設(shè)置child_form, child_namechild_name_plural,并且store_children方法應(yīng)返回True簸喂。你可以從數(shù)據(jù)庫加載數(shù)據(jù)來驗證__init__方法毙死。
</ul>

Paste_Image.png

自定義設(shè)置和可編輯的列表的例子:

class LinkList(DashboardModule):
    title = 'Links'
    template = 'jet.dashboard/modules/link_list.html'
    layout = 'stacked'
    children = []
    settings_form = LinkListSettingsForm
    child_form = LinkListItemForm
    child_name = 'Link'
    child_name_plural = 'Links'

    def __init__(self, title=None, children=list(), **kwargs):
        children = list(map(self.parse_link, children))
        kwargs.update({'children': children})
        super(LinkList, self).__init__(title, **kwargs)

    def settings_dict(self):
        return {
            'layout': self.layout
        }

    def load_settings(self, settings):
        self.layout = settings.get('layout', self.layout)

    def store_children(self):
        return True

    def parse_link(self, link):
        if isinstance(link, (tuple, list)):
            link_dict = {'title': link[0], 'url': link[1]}
            if len(link) >= 3:
                link_dict['external'] = link[2]
            return link_dict
        elif isinstance(link, (dict,)):
            return link


class LinkListSettingsForm(forms.Form):
    layout = forms.ChoiceField(label='Layout', choices=(('stacked', 'Stacked'), ('inline', 'Inline')))


class LinkListItemForm(forms.Form):
    url = forms.CharField(label='URL')
    title = forms.CharField(label='Title')
    external = forms.BooleanField(label='External link', required=False)

創(chuàng)建模塊模版

在模塊類中指定的位置創(chuàng)建模版。模塊的實例將傳到這個模版中并被命名為module以便從其中獲得數(shù)據(jù)

{% load humanize %}

<ul>
    {% for ticket in module.children %}
        <li>
            <span class="float-right">
                <span class="dim">
                    {{ ticket.date_add|naturalday }} <span class="icon-clock tooltip" title="{{ ticket.date_add }}"></span>
                </span>
            </span>

            {% if ticket.forwarded %}
                <span class="icon-tick" style="color: #8ecb8e;"></span>
            {% else %}
                <span class="icon-cross" style="color: #dba4a4;"></span>
            {% endif %}

            <a href="{{ ticket.get_admin_url }}">{{ ticket.name }}</a>
        </li>
    {% empty %}
        <li>
            Nothing to show
        </li>
    {% endfor %}
</ul>

添加模塊視圖(可選)

如果您的dashboard modules需要有自己的屬兔您可以將他們按照下面的方法注冊并且存儲到文件中(如dashboard_modules_view.py)喻鳄。

from django.conf.urls import url
from django.contrib import messages
from django.shortcuts import redirect
from jet.dashboard import dashboard
from core.utils.utils import DatabaseManager


def update_database(request):
    database_manager = DatabaseManager()
    database_manager.update_database()

    messages.success(request, 'Database was successfully updated')

    return redirect(request.META.get('HTTP_REFERER'))

# This method registers view's url
dashboard.urls.register_urls([
    url(
        r'^update_database/',
        update_database,
        name='update-database'
    ),
])

您應(yīng)該在dashboard urls導(dǎo)入到主urls.py文件中之前導(dǎo)入這個文件

from django.conf import settings
from django.conf.urls import include, url
from django.contrib import admin

# Import dashboard module views
from core import dashboard_modules_views

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^jet/', include('jet.urls', 'jet')),
    url(r'^jet/dashboard/', include('jet.dashboard.urls', 'jet-dashboard')),
    ...
]

之后你可以按照下面的方法reverse url
{% url "jet-dashboard:update-database" %}

Dashboard API

這一頁用來描述dashboard和dashboard modules的相關(guān)接口扼倘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市除呵,隨后出現(xiàn)的幾起案子再菊,更是在濱河造成了極大的恐慌,老刑警劉巖颜曾,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纠拔,死亡現(xiàn)場離奇詭異,居然都是意外死亡泛啸,警方通過查閱死者的電腦和手機绿语,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門秃症,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吕粹,你說我怎么就攤上這事种柑。” “怎么了匹耕?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵聚请,是天一觀的道長。 經(jīng)常有香客問我稳其,道長驶赏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任既鞠,我火速辦了婚禮煤傍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘱蛋。我一直安慰自己蚯姆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布洒敏。 她就那樣靜靜地躺著龄恋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凶伙。 梳的紋絲不亂的頭發(fā)上郭毕,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音函荣,去河邊找鬼显押。 笑死,一個胖子當(dāng)著我的面吹牛傻挂,可吹牛的內(nèi)容都是我干的煮落。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼踊谋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旋讹?” 一聲冷哼從身側(cè)響起殖蚕,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沉迹,沒想到半個月后睦疫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鞭呕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年蛤育,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓦糕,死狀恐怖底洗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咕娄,我是刑警寧澤亥揖,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站圣勒,受9級特大地震影響费变,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圣贸,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一挚歧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吁峻,春花似錦滑负、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耕餐,卻和暖如春凡傅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肠缔。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工夏跷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人明未。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓槽华,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趟妥。 傳聞我的和親對象是個殘疾皇子猫态,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容