關(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>
<li>
<li>
安裝#
當(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文件才能使用自己的主題液斜。
菜單壓縮
如果您沒有很多的應(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
在頁面上添加前進(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)的幾種模型-StackedInline
和TabularInline
蟆盹。在沒有那么多對象時大部分使用的都是StackedInline
的方式孩灯。如果相關(guān)聯(lián)的模型很多,TabularInline
可以幫助到您逾滥,但是當(dāng)相關(guān)聯(lián)的模型有很多字段的話并不方便關(guān)聯(lián)他們峰档。為了解決這個問題JET內(nèi)置了CompactInline
類。
用法
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)該將你的控件添加到children
和available_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
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'
指定控件的布局姆蘸,允許值為stacked
或inline
AppList
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
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
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
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
控件
安裝
<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需要額外安裝
安裝
<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_dict
和load_settings
方法筷屡。如要自定義內(nèi)容的話應(yīng)該設(shè)置child_form
, child_name
和child_name_plural
,并且store_children
方法應(yīng)返回True
簸喂。你可以從數(shù)據(jù)庫加載數(shù)據(jù)來驗證__init__
方法毙死。
</ul>
自定義設(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)接口扼倘。