自動管理界面是Django最強大的部分之一。它從您的模型中讀取元數據,以提供一個快速,以模型爲中心的界面,讓受信任的用戶能夠管理您網站上的內容。管理員建議的使用僅限於組織的內部管理工具。它並不打算構建你的整個前端。javascript
管理員有不少自定義鉤子,但要當心嘗試獨佔使用這些鉤子。若是您須要提供一個更加以流程爲中心的接口,以抽象出數據庫表和字段的實現細節,那麼多是編寫本身的視圖的時候了。css
在本文中,咱們將討論如何激活,使用和自定義Django的管理界面。html
管理員在默認的項目模板中使用 startproject
。前端
做爲參考,這裏是要求:java
'django.contrib.admin'
到您的INSTALLED_APPS
設置。django.contrib.auth
和 。若是這些應用程序不在您的列表中,請添加它們。django.contrib.contenttypes
django.contrib.messages
django.contrib.sessions
INSTALLED_APPS
django.contrib.auth.context_processors.auth
和 django.contrib.messages.context_processors.messages
到'context_processors'
了的選項DjangoTemplates
在您定義的後端TEMPLATES
,以及 django.contrib.auth.middleware.AuthenticationMiddleware
和 django.contrib.messages.middleware.MessageMiddleware
對 MIDDLEWARE
。這些默認狀況下都處於活動狀態,因此若是您手動調整了設置,則只需執行此操做。ModelAdmin
封裝了該特定模型的自定義管理功能和選項的類。AdminSite
並告訴它關於你的每一個模型和 ModelAdmin
類。AdminSite
實例掛鉤到您的URLconf中。完成這些步驟後,您能夠經過訪問您掛鉤的URL(/admin/
默認狀況下)來使用您的Django管理站點。若是您須要建立用戶登陸,您可使用該createsuperuser
命令。jquery
ModelAdmin
對象¶ModelAdmin
[source]
¶
該ModelAdmin
班是在管理界面模型的表示。一般,這些文件存儲admin.py
在您的應用程序中指定的文件中。咱們來看一個很是簡單的例子ModelAdmin
:後端
from django.contrib import admin
from myproject.myapp.models import Author
class AuthorAdmin(admin.ModelAdmin):
pass
admin.site.register(Author, AuthorAdmin)
你須要一個ModelAdmin
物體嗎?
在前面的例子中,ModelAdmin
類沒有定義任何自定義值(還沒有)。所以,將提供默認的管理界面。若是您對默認的管理界面感到滿意,則根本不須要定義ModelAdmin
對象 - 您能夠在不提供ModelAdmin
描述的狀況下注冊模型類。前面的例子能夠簡化爲:
from django.contrib import admin
from myproject.myapp.models import Author
admin.site.register(Author)
register
裝飾¶register
(
* models
,
site = django.admin.sites.site
)
[source]
¶
還有一個註冊你的ModelAdmin
類的裝飾器:
from django.contrib import admin
from .models import Author
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
pass
若是您未使用默認值,則會 爲其指定一個或多個模型類以註冊ModelAdmin
和一個可選的關鍵字參數:site
AdminSite
from django.contrib import admin
from .models import Author, Reader, Editor
from myproject.admin_site import custom_admin_site
@admin.register(Author, Reader, Editor, site=custom_admin_site)
class PersonAdmin(admin.ModelAdmin):
pass
若是必須在__init__()
方法中引用模型admin類,則不能使用此裝飾器,例如 。若是您使用Python 3而且沒必要擔憂支持Python 2,則可使用。不然,你將不得不使用 這個裝飾器。super(PersonAdmin, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
admin.site.register()
當你放入'django.contrib.admin'
你的INSTALLED_APPS
設置時,Django自動admin
在每一個應用程序中查找一個模塊並導入它。
apps.
AdminConfig
¶
這是AppConfig
管理員的默認類。它autodiscover()
在Django啓動時調用。
apps.
SimpleAdminConfig
¶
這個類的做用就像AdminConfig
,除非它沒有調用autodiscover()
。
autodiscover
()
[source]
¶
此功能嘗試admin
在每一個已安裝的應用程序中導入模塊。預計這些模塊將向管理員註冊模型。
一般你不須要直接調用這個函數做爲 AdminConfig
Django啓動時的調用。
若是您使用的是自定義AdminSite
,則一般會將全部 ModelAdmin
子類導入您的代碼並將其註冊到自定義 AdminSite
。在這種狀況下,爲了禁用自動發現,你應該把'django.contrib.admin.apps.SimpleAdminConfig'
,而不是 'django.contrib.admin'
在你的INSTALLED_APPS
設置。
ModelAdmin
選項¶這ModelAdmin
很是靈活。它有幾個處理定製界面的選項。全部選項都在ModelAdmin
子類上定義:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
date_hierarchy = 'pub_date'
ModelAdmin.
actions_on_top
¶
ModelAdmin.
actions_on_bottom
¶
控制頁面上操做欄的顯示位置。默認狀況下,管理更改列表顯示頁面頂部的操做()。actions_on_top = True; actions_on_bottom = False
ModelAdmin.
actions_selection_counter
¶
控制是否在操做下拉菜單旁邊顯示選擇計數器。默認狀況下,管理員更改列表將顯示它()。actions_selection_counter = True
ModelAdmin.
date_hierarchy
¶
設置date_hierarchy
爲 模型名稱DateField
或DateTimeField
模型名稱,更改列表頁面將包含該字段的基於日期的向下鑽取導航。
例:
date_hierarchy = 'pub_date'
您還可使用__
查找在相關模型上指定一個字段,例如:
date_hierarchy = 'author__pub_date'
這將根據可用數據智能填充自身,例如,若是全部日期都在一個月內,它將只顯示日期級別的下鑽。
增長了在相關模型上引用字段的功能。
注意
date_hierarchy
QuerySet.datetimes()
內部使用。若是啓用時區支持(),請參閱其文檔以瞭解一些注意事項。USE_TZ = True
ModelAdmin.
empty_value_display
¶
該屬性將覆蓋記錄的空字段(None
空字符串等)的默認顯示值。默認值是-
(短劃線)。例如:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
empty_value_display = '-empty-'
你也能夠覆蓋empty_value_display
全部的管理頁面 AdminSite.empty_value_display
,或者像這樣的特定字段:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title', 'view_birth_date')
def view_birth_date(self, obj):
return obj.birth_date
view_birth_date.empty_value_display = '???'
ModelAdmin.
exclude
¶
該屬性(若是給出)應該是從表單中排除的字段名稱列表。
例如,讓咱們考慮如下模型:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
title = models.CharField(max_length=3)
birth_date = models.DateField(blank=True, null=True)
若是你想要一個Author
只包含name
和title
字段的模型的表單,你能夠指定fields
或exclude
像這樣:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title')
class AuthorAdmin(admin.ModelAdmin):
exclude = ('birth_date',)
因爲做者模型只有三個字段,name
,title
,和 birth_date
,從上面的聲明產生的形式將包含徹底相同的領域。
ModelAdmin.
fields
¶
使用該fields
選項能夠在「添加」和「更改」頁面上的表單中進行簡單的佈局更改,例如僅顯示可用字段的子集,修改其順序或將它們分組成行。例如,您能夠爲該django.contrib.flatpages.models.FlatPage
模型定義一個更簡單的管理員表單版本, 以下所示:
class FlatPageAdmin(admin.ModelAdmin):
fields = ('url', 'title', 'content')
在上面的例子中,只有字段url
,title
並將content
依次顯示在表單中。fields
能夠包含定義ModelAdmin.readonly_fields
爲顯示爲只讀的值。
如需更復雜的佈局需求,請參閱fieldsets
選項。
fields
與此不一樣的是list_display
,該選項可能只包含模型上的字段名稱或由指定的表單 form
。它只有列入英文才可能包含可卡因readonly_fields
。
要在同一行顯示多個字段,請將這些字段包裝在本身的元組中。在這個例子中,url
和title
字段將顯示在同一行上,而且content
字段將顯示在它們的下面:
class FlatPageAdmin(admin.ModelAdmin):
fields = (('url', 'title'), 'content')
注意
此fields
選項不該與選項fields
內的字典密鑰混淆fieldsets
,以下一節所述。
若是既沒有fields
也沒有fieldsets
選項,Django將默認顯示每一個不是AutoField
和的字段,而且editable=True
在單個字段集中按照與模型中定義的字段相同的順序顯示。
ModelAdmin.
fieldsets
¶
設置fieldsets
爲控制管理「添加」和「更改」頁面的佈局。
fieldsets
是一個二元組列表,其中每一個二元組表明一個<fieldset>
在管理頁面上的a元組 。(A <fieldset>
是表格的「部分」。)
二元組的格式爲:其中 是一個字符串,表示字段集的標題,而且是關於字段集的信息字典,包括要在其中顯示的字段列表。(name, field_options)
name
field_options
一個完整的例子,取自 django.contrib.flatpages.models.FlatPage
模型:
from django.contrib import admin
class FlatPageAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('url', 'title', 'content', 'sites')
}),
('Advanced options', {
'classes': ('collapse',),
'fields': ('registration_required', 'template_name'),
}),
)
這會產生一個以下所示的管理頁面:
若是既沒有fieldsets
也沒有fields
選項,Django將默認顯示每一個不是AutoField
和的字段,而且editable=True
在單個字段集中按照與模型中定義的字段相同的順序顯示。
該field_options
字典能夠包含如下鍵值:
fields
要在此字段集中顯示的字段名稱的元組。該密鑰是必需的。
例:
{
'fields': ('first_name', 'last_name', 'address', 'city', 'state'),
}
與fields
選項同樣,要在同一行顯示多個字段,請將這些字段包裝在它們本身的元組中。在這個例子中,first_name
和last_name
字段將顯示在同一行上:
{
'fields': (('first_name', 'last_name'), 'address', 'city', 'state'),
}
fields
能夠包含定義 readonly_fields
爲顯示爲只讀的值。
若是您添加了可調用的名稱fields
,則適用與fields
選項相同的規則:必須列出可調用的名稱readonly_fields
。
classes
包含額外CSS類以應用於字段集的列表或元組。
例:
{
'classes': ('wide', 'extrapretty'),
}
由默認管理網站樣式表定義的兩個有用的類是 collapse
和wide
。具備該collapse
樣式的字段集將首先在管理員中摺疊並替換爲一個小的「點擊展開」連接。與字段集wide
的風格將給予額外的水平空間。
description
一組可選的額外文本顯示在每一個字段集的頂部,位於字段集的標題下。TabularInline
因爲其佈局,此字符串未呈現。
請注意,該值在管理界面中顯示時不是 HTML轉義的。若是你願意的話,這可讓你包含HTML。或者,您可使用純文本並 django.utils.html.escape()
轉義任何HTML特殊字符。
ModelAdmin.
filter_horizontal
¶
默認狀況下,a ManyToManyField
在管理站點中顯示爲a 。可是,選擇多個項目時,多選框可能很難使用。添加一個 到這個列表將改成使用一個漂亮的不顯眼的JavaScript「過濾器」界面,容許在選項內進行搜索。未選中和選定的選項並排顯示在兩個框中。請參閱使用垂直界面。<select multiple>
ManyToManyField
filter_vertical
ModelAdmin.
filter_vertical
¶
filter_horizontal
與之相同,但使用過濾器界面的垂直顯示,並在所選選項框的上方顯示未選定的選項框。
ModelAdmin.
form
¶
默認狀況下,ModelForm
會爲您的模型動態建立。它用於建立添加/更改頁面上顯示的表單。您能夠輕鬆地提供本身的設置ModelForm
來覆蓋添加/更改頁面上的任何默認表單行爲。或者,您能夠自定義默認表單,而不是經過使用該ModelAdmin.get_form()
方法指定一個全新的表單 。
有關示例,請參閱向管理員添加自定義驗證部分。
注意
若是您Meta.model
在a上定義屬性 ModelForm
,則還必須定義 Meta.fields
屬性(或Meta.exclude
屬性)。可是,因爲管理員有本身的定義字段的方式,該Meta.fields
屬性將被忽略。
若是ModelForm
僅用於管理員,最簡單的解決方案是省略該Meta.model
屬性,由於它ModelAdmin
會提供正確的模型以供使用。或者,您能夠在課堂上設置 以知足對課程的驗證 。fields = []
Meta
ModelForm
注意
若是你ModelForm
和ModelAdmin
他們都定義了一個exclude
選項,那麼ModelAdmin
優先:
from django import forms
from django.contrib import admin
from myapp.models import Person
class PersonForm(forms.ModelForm):
class Meta:
model = Person
exclude = ['name']
class PersonAdmin(admin.ModelAdmin):
exclude = ['age']
form = PersonForm
在上例中,「年齡」字段將被排除,但「名稱」字段將包含在生成的表單中。
ModelAdmin.
formfield_overrides
¶
這提供了一種快速和骯髒的方式來覆蓋Field
在管理中使用的一些 選項。 formfield_overrides
是一個將字段類映射爲參數字典的字典,以在施工時傳遞給字段。
因爲這有點抽象,咱們來看一個具體的例子。最多見的用法formfield_overrides
是爲特定類型的字段添加自定義小部件。因此,想象一下,咱們已經寫了一個RichTextEditorWidget
咱們想用於大文本字段而不是默認的字段 <textarea>
。如下是咱們如何作到的:
from django.db import models
from django.contrib import admin
# Import our custom widget and our model from where they're defined
from myapp.widgets import RichTextEditorWidget
from myapp.models import MyModel
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': RichTextEditorWidget},
}
請注意,字典中的鍵是實際的字段類,而不是字符串。價值是另外一個字典; 這些參數將傳遞給表單字段的__init__()
方法。有關詳細信息,請參閱表單API。
警告
若是要使用具備關係字段(即ForeignKey
或 ManyToManyField
)的自定義小部件 ,請確保您沒有在raw_id_fields
或中包含該字段的名稱radio_fields
。
formfield_overrides
不會讓你改變已經raw_id_fields
或radio_fields
設置的關係字段上的小部件。這是由於raw_id_fields
並radio_fields
暗示本身的定製小部件。
ModelAdmin.
inlines
¶
請參閱InlineModelAdmin
下面的對象以及 ModelAdmin.get_formsets_with_inlines()
。
ModelAdmin.
list_display
¶
設置list_display
爲控制哪些字段顯示在管理員的更改列表頁面上。
例:
list_display = ('first_name', 'last_name')
若是您沒有設置list_display
,管理網站將顯示一個顯示每一個對象__str__()
(__unicode__()
在Python 2上)表示的單個列。
您可使用四種可能的值list_display
:
模型的一個字段。例如:
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name')
一個可調用的接受模型實例的一個參數。例如:
def upper_case_name(obj):
return ("%s%s" % (obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Name'
class PersonAdmin(admin.ModelAdmin):
list_display = (upper_case_name,)
表示屬性的字符串ModelAdmin
。這與可調用的行爲相同。例如:
class PersonAdmin(admin.ModelAdmin):
list_display = ('upper_case_name',)
def upper_case_name(self, obj):
return ("%s%s" % (obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Name'
表示模型上屬性的字符串。這與可調用的行爲幾乎相同,但self
在此狀況下是模型實例。如下是一個完整的示例:
from django.db import models
from django.contrib import admin
class Person(models.Model):
name = models.CharField(max_length=50)
birthday = models.DateField()
def decade_born_in(self):
return self.birthday.strftime('%Y')[:3] + "0's"
decade_born_in.short_description = 'Birth decade'
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'decade_born_in')
須要注意的幾個特殊狀況list_display
:
若是該字段是a ForeignKey
,Django將顯示相關對象的 __str__()
(__unicode__()
在Python 2上)。
ManyToManyField
字段不受支持,由於這須要爲表中的每一行執行單獨的SQL語句。若是你想這樣作,給你的模型一個自定義的方法,並添加該方法的名稱list_display
。(有關自定義方法的更多信息,請參見下文list_display
。)
若是該字段是BooleanField
或NullBooleanField
,Django將顯示一個漂亮的「開」或「關」圖標而不是True
或 False
。
若是給定的字符串是模型的方法ModelAdmin
或可調用的字符串,Django默認會HTML輸出。要逃避用戶輸入並容許本身未轉義的標籤,請使用 format_html()
。
這是一個完整的示例模型:
from django.db import models
from django.contrib import admin
from django.utils.html import format_html
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colored_name(self):
return format_html(
'<span style="color: #{};">{}{}</span>',
self.color_code,
self.first_name,
self.last_name,
)
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'colored_name')
自1.9版棄用:在舊版本中,您能夠allow_tags
向方法添加屬性以防止自動轉義。該屬性是不爲它的安全使用format_html()
, format_html_join()
或 mark_safe()
代替。
正如一些示例已經說明的那樣,在使用可調用對象,模型方法或ModelAdmin
方法時,能夠經過向short_description
可調用對象添加屬性來自定義列的標題。
若是一個字段的值是None
一個空字符串,或者一個沒有元素的迭代,Django將顯示-
(一個破折號)。你能夠重寫此AdminSite.empty_value_display
:
from django.contrib import admin
admin.site.empty_value_display = '(None)'
你也可使用ModelAdmin.empty_value_display
:
class PersonAdmin(admin.ModelAdmin):
empty_value_display = 'unknown'
或者在現場層面:
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'birth_date_view')
def birth_date_view(self, obj):
return obj.birth_date
birth_date_view.empty_value_display = 'unknown'
若是給定的字符串是模型的一個方法,ModelAdmin
或者返回True或False的可調用方法,那麼若是給方法一個boolean
值爲的屬性,Django將顯示一個漂亮的「on」或「off」圖標True
。
這是一個完整的示例模型:
from django.db import models
from django.contrib import admin
class Person(models.Model):
first_name = models.CharField(max_length=50)
birthday = models.DateField()
def born_in_fifties(self):
return self.birthday.strftime('%Y')[:3] == '195'
born_in_fifties.boolean = True
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'born_in_fifties')
在__str__()
(__unicode__()
Python的2)方法只是做爲有效的list_display
任何其餘模型的方法,因此這是徹底能夠作到這一點:
list_display = ('__str__', 'some_other_field')
一般,這些元素list_display
不是實際的數據庫字段不能用於排序(由於Django在數據庫級別進行全部排序)。
可是,若是元素list_display
表明某個數據庫字段,則能夠經過設置admin_order_field
該項目的屬性來指明這一事實 。
例如:
from django.db import models
from django.contrib import admin
from django.utils.html import format_html
class Person(models.Model):
first_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colored_first_name(self):
return format_html(
'<span style="color: #{};">{}</span>',
self.color_code,
self.first_name,
)
colored_first_name.admin_order_field = 'first_name'
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'colored_first_name')
以上將告訴Django first_name
在試圖colored_first_name
在管理員中排序時按字段排序。
要指示降序,admin_order_field
能夠在字段名稱上使用連字符前綴。使用上面的例子,這看起來像:
colored_first_name.admin_order_field = '-first_name'
admin_order_field
支持查詢查找按相關模型上的值進行排序。此示例在列表顯示中包含「做者名」列,並容許按名稱對其進行排序:
class Blog(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(Person, on_delete=models.CASCADE)
class BlogAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'author_first_name')
def author_first_name(self, obj):
return obj.author.first_name
author_first_name.admin_order_field = 'author__first_name'
元素list_display
也能夠是屬性。可是,請注意,因爲性能在Python工做,設置的方式 short_description
使用時,一個屬性是惟一可能的 property()
功能,並沒有與@property
裝飾。
例如:
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def my_property(self):
return self.first_name + ' ' + self.last_name
my_property.short_description = "Full name of the person"
full_name = property(my_property)
class PersonAdmin(admin.ModelAdmin):
list_display = ('full_name',)
字段名稱list_display
也將在HTML輸出中以CSS 元素的形式出現column-<field_name>
在每一個<th>
元素上。例如,這能夠用來設置CSS文件中的列寬。
Django將嘗試list_display
按照如下順序解釋每一個元素:
ModelAdmin
屬性的字符串。例如,若是您有first_name
模型字段和ModelAdmin
屬性,則將使用模型字段。
ModelAdmin.
list_display_links
¶
使用list_display_links
來控制是否以及哪些字段 list_display
應與「變」的頁面對象。
默認狀況下,更改列表頁面會將第一列(指定的第一個字段)連接list_display
到每一個項目的更改頁面。但list_display_links
讓你改變這一點:
將其設置None
爲根本沒有連接。
將其設置爲列表或元組的字段(格式相同 list_display
),其列要轉換爲連接。
您能夠指定一個或多個字段。只要字段出現 list_display
在內,Django就不會關心鏈接了多少個(或多少個)字段。惟一的要求是,若是你想以list_display_links
這種方式使用 ,你必須定義list_display
。
在這個例子中,first_name
和last_name
字段將連接到更改列表頁面上:
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'birthday')
list_display_links = ('first_name', 'last_name')
在這個例子中,更改列表頁面網格將沒有連接:
class AuditEntryAdmin(admin.ModelAdmin):
list_display = ('timestamp', 'message')
list_display_links = None
ModelAdmin.
list_editable
¶
設置list_editable
爲模型上的字段名稱列表,該列表將容許在更改列表頁面上進行編輯。也就是說,列出的字段 list_editable
將顯示爲更改列表頁面上的表格小部件,容許用戶一次編輯和保存多行。
注意
list_editable
以特定方式與其餘一些選項進行交互; 你應該注意如下規則:
list_editable
也必須在list_display
。您沒法編輯未顯示的字段!list_editable
而且 list_display_links
- 字段不能同時是表單和連接。若是這些規則中的任何一個被破壞,您將獲得驗證錯誤。
ModelAdmin.
list_filter
¶
設置list_filter
爲激活管理員更改列表頁右側欄中的過濾器,以下圖所示:
list_filter
應該是元素的列表或元組,其中每一個元素應該是如下類型之一:
字段名稱,其中指定的字段應該是一個 BooleanField
,CharField
,DateField
,DateTimeField
, IntegerField
,ForeignKey
或ManyToManyField
,例如:
class PersonAdmin(admin.ModelAdmin):
list_filter = ('is_staff', 'company')
字段名稱list_filter
也可使用__
查找跨越關係,例如:
class PersonAdmin(admin.UserAdmin):
list_filter = ('company__name',)
一個繼承的類django.contrib.admin.SimpleListFilter
,你須要提供title
和parameter_name
屬性,並覆蓋lookups
和queryset
方法,例如:
from datetime import date
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
class DecadeBornListFilter(admin.SimpleListFilter):
# Human-readable title which will be displayed in the
# right admin sidebar just above the filter options.
title = _('decade born')
# Parameter for the filter that will be used in the URL query.
parameter_name = 'decade'
def lookups(self, request, model_admin):
"""
Returns a list of tuples. The first element in each
tuple is the coded value for the option that will
appear in the URL query. The second element is the
human-readable name for the option that will appear
in the right sidebar.
"""
return (
('80s', _('in the eighties')),
('90s', _('in the nineties')),
)
def queryset(self, request, queryset):
"""
Returns the filtered queryset based on the value
provided in the query string and retrievable via
`self.value()`.
"""
# Compare the requested value (either '80s' or '90s')
# to decide how to filter the queryset.
if self.value() == '80s':
return queryset.filter(birthday__gte=date(1980, 1, 1),
birthday__lte=date(1989, 12, 31))
if self.value() == '90s':
return queryset.filter(birthday__gte=date(1990, 1, 1),
birthday__lte=date(1999, 12, 31))
class PersonAdmin(admin.ModelAdmin):
list_filter = (DecadeBornListFilter,)
注意
爲了方便,將HttpRequest
對象傳遞給 lookups
and queryset
方法,例如:
class AuthDecadeBornListFilter(DecadeBornListFilter):
def lookups(self, request, model_admin):
if request.user.is_superuser:
return super(AuthDecadeBornListFilter, self).lookups(request, model_admin)
def queryset(self, request, queryset):
if request.user.is_superuser:
return super(AuthDecadeBornListFilter, self).queryset(request, queryset)
一樣爲了方便起見,該ModelAdmin
對象被傳遞給該lookups
方法,例如,若是您想要查找可用數據:
class AdvancedDecadeBornListFilter(DecadeBornListFilter):
def lookups(self, request, model_admin):
"""
Only show the lookups if there actually is
anyone born in the corresponding decades.
"""
qs = model_admin.get_queryset(request)
if qs.filter(birthday__gte=date(1980, 1, 1),
birthday__lte=date(1989, 12, 31)).exists():
yield ('80s', _('in the eighties'))
if qs.filter(birthday__gte=date(1990, 1, 1),
birthday__lte=date(1999, 12, 31)).exists():
yield ('90s', _('in the nineties'))
一個元組,第一個元素是一個字段名,第二個元素是一個繼承的類 django.contrib.admin.FieldListFilter
,例如:
class PersonAdmin(admin.ModelAdmin):
list_filter = (
('is_staff', admin.BooleanFieldListFilter),
)
您可使用如下方法將相關模型的選擇限制爲涉及該關係的對象RelatedOnlyFieldListFilter
:
class BookAdmin(admin.ModelAdmin):
list_filter = (
('author', admin.RelatedOnlyFieldListFilter),
)
假設author
是ForeignKey
一個User
模型,這將限制list_filter
選擇,誰寫的,而不是列出全部用戶一本書的用戶。
注意
該FieldListFilter
API被認爲是內部的,而且可能被改變。
列表過濾器一般僅在過濾器有多個選項時出現。過濾器的has_output()
方法控制它是否出現。
能夠指定用於呈現列表過濾器的自定義模板:
class FilterWithCustomTemplate(admin.SimpleListFilter):
template = "custom_template.html"
有關admin/filter.html
具體示例,請參閱Django()提供的默認模板。
ModelAdmin.
list_max_show_all
¶
設置list_max_show_all
爲控制在「顯示所有」管理更改列表頁面上能夠顯示多少項目。只有當結果總數小於或等於此設置時,管理員纔會在更改列表中顯示「所有顯示」連接。默認狀況下,它被設置爲200
。
ModelAdmin.
list_per_page
¶
設置list_per_page
爲控制每一個分頁的管理更改列表頁面上顯示的項目數量。默認狀況下,它被設置爲100
。
ModelAdmin.
list_select_related
¶
設置list_select_related
爲告訴Django使用它 select_related()
來檢索管理更改列表頁面上的對象列表。這能夠爲您節省一堆數據庫查詢。
該值應該是布爾值,列表或元組。默認是 False
。
當價值是True
,select_related()
將永遠被稱爲。當值設置False
爲時,Django將查看list_display
並呼叫, select_related()
若是有任何ForeignKey
存在。
若是您須要更細粒度的控制,請使用元組(或列表)做爲值 list_select_related
。空元組將阻止Django從select_related
根本上調用 。任何其餘元組將直接傳遞給 select_related
參數。例如:
class ArticleAdmin(admin.ModelAdmin):
list_select_related = ('author', 'category')
會打電話。select_related('author', 'category')
若是您須要根據請求指定動態值,則能夠實施一種get_list_select_related()
方法。
ModelAdmin.
ordering
¶
設置ordering
爲指定如何在Django管理視圖中排列對象列表。這應該是與模型ordering
參數具備相同格式的列表或元組。
若是沒有提供,Django管理員將使用模型的默認排序。
若是您須要指定動態順序(例如取決於用戶或語言),則能夠實施一種get_ordering()
方法。
ModelAdmin.
paginator
¶
paginator類用於分頁。默認狀況下, django.core.paginator.Paginator
使用。若是自定義分頁程序類沒有與之相同的構造函數接口 django.core.paginator.Paginator
,則還須要爲其提供實現ModelAdmin.get_paginator()
。
ModelAdmin.
prepopulated_fields
¶
設置prepopulated_fields
字典映射字段名稱到它應該預填充的字段:
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
設置時,給定的字段將使用一點JavaScript來從指定的字段填充。此功能的主要用途是自動爲SlugField
一個或多個其餘字段的字段生成值。生成的值經過鏈接源字段的值生成,而後將該結果轉換爲有效的段落(例如,用空格替換空格)。
prepopulated_fields
不接受DateTimeField
,ForeignKey
, OneToOneField
,和ManyToManyField
領域。
ModelAdmin.
preserve_filters
¶
管理員在建立,編輯或刪除對象後,如今會在列表視圖中保留過濾器。您能夠經過設置此屬性來恢復先前清除過濾器的行爲False
。
ModelAdmin.
radio_fields
¶
默認狀況下,Django的管理員爲ForeignKey
已choices
設置或已設置的字段使用選擇框界面(<select>)。若是存在一個字段radio_fields
,Django將使用一個單選按鈕接口。假設group
是ForeignKey
對Person
模型:
class PersonAdmin(admin.ModelAdmin):
radio_fields = {"group": admin.VERTICAL}
您能夠選擇使用HORIZONTAL
或VERTICAL
從 django.contrib.admin
模塊中選擇。
radio_fields
除非ForeignKey
已choices
設置或已 設置,不然不要包含字段。
ModelAdmin.
raw_id_fields
¶
默認狀況下,Django的管理員使用選擇框界面(<select>)來顯示字段ForeignKey
。有時你不想承擔必須選擇全部相關實例以顯示在下拉菜單中的開銷。
raw_id_fields
是您想要更改成Input
a ForeignKey
或 小部件的字段列表ManyToManyField
:
class ArticleAdmin(admin.ModelAdmin):
raw_id_fields = ("newspaper",)
raw_id_fields
Input
若是該字段是a,則該小部件應包含主鍵,若是該字段是a,則該部分應包含以ForeignKey
逗號分隔的值列表ManyToManyField
。該raw_id_fields
小部件在該字段旁邊顯示放大鏡按鈕,該按鈕容許用戶搜索並選擇一個值:
ModelAdmin.
readonly_fields
¶
默認狀況下,管理員將全部字段顯示爲可編輯。此選項中的任何字段(應該是a list
或tuple
)將按原樣顯示其數據而且不可編輯; 它們也被排除在 ModelForm
用於建立和編輯的位置。請注意,指定ModelAdmin.fields
或ModelAdmin.fieldsets
只讀字段必須存在才能顯示(不然將被忽略)。
若是readonly_fields
在沒有定義顯式排序的狀況下使用, ModelAdmin.fields
或者ModelAdmin.fieldsets
將在全部可編輯字段以後最後添加。
只讀字段不只能夠顯示模型字段中的數據,還能夠顯示模型方法的輸出或ModelAdmin
類自己的方法 。這與ModelAdmin.list_display
行爲很是類似 。這提供了一種簡單的方法來使用管理界面來提供關於正在編輯的對象狀態的反饋,例如:
from django.contrib import admin
from django.utils.html import format_html_join
from django.utils.safestring import mark_safe
class PersonAdmin(admin.ModelAdmin):
readonly_fields = ('address_report',)
def address_report(self, instance):
# assuming get_full_address() returns a list of strings
# for each line of the address and you want to separate each
# line by a linebreak
return format_html_join(
mark_safe('<br/>'),
'{}',
((line,) for line in instance.get_full_address()),
) or mark_safe("<span class='errors'>I can't determine this address.</span>")
# short_description functions like a model field's verbose_name
address_report.short_description = "Address"
ModelAdmin.
save_as
¶
設置save_as
爲在管理員更改表單上啓用「另存爲新功能」功能。
一般,對象有三個保存選項:「保存」,「保存並繼續編輯」和「保存並添加另外一個」。若是save_as
是True
,「保存並添加另外一個」將被替換爲「Save as new」按鈕,該按鈕將建立一個新對象(使用新的ID),而不是更新現有對象。
默認狀況下,save_as
設置爲False
。
ModelAdmin.
save_as_continue
¶
什麼時候save_as=True
,保存新對象以後的默認重定向是指該對象的更改視圖。若是您設置 save_as_continue=False
,重定向將轉到更改列表視圖。
默認狀況下,save_as_continue
設置爲True
。
ModelAdmin.
save_on_top
¶
設置save_on_top
爲在管理員更改表單頂部添加保存按鈕。
一般,保存按鈕只出如今表格的底部。若是設置save_on_top
,按鈕將出如今頂部和底部。
默認狀況下,save_on_top
設置爲False
。
ModelAdmin.
search_fields
¶
設置search_fields
爲啓用管理員更改列表頁面上的搜索框。這應該設置爲一個字段名稱列表,只要有人在該文本框中提交搜索查詢,就會搜索該字段名稱。
這些字段應該是某種文本字段,例如CharField
或 TextField
。您也能夠在執行相關的查詢ForeignKey
或 ManyToManyField
與查找API「跟隨」符號:
search_fields = ['foreign_key__related_fieldname']
例如,若是您有做者的博客條目,則如下定義將啓用經過做者的電子郵件地址搜索博客條目:
search_fields = ['user__email']
當有人在管理搜索框中進行搜索時,Django會將搜索查詢拆分爲單詞並返回包含每一個單詞的全部對象,不區分大小寫,每一個單詞必須至少包含一個單詞 search_fields
。例如,若是search_fields
設置爲 而且用戶搜索,則Django將執行與此SQL 子句等效的操做:['first_name', 'last_name']
john lennon
WHERE
WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%')
AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')
對於更快和/或更具限制性的搜索,請在字段名稱前加上運算符:
^
使用'^'運算符匹配字段開始處的開始。例如,若是search_fields
設置爲 而且用戶搜索 ,則Django將執行與此SQL 子句等效的操做:['^first_name', '^last_name']
john lennon
WHERE
WHERE (first_name ILIKE 'john%' OR last_name ILIKE 'john%')
AND (first_name ILIKE 'lennon%' OR last_name ILIKE 'lennon%')
這個查詢比普通'%john%'
查詢更有效率,由於數據庫只須要檢查列數據的開始,而不是查找整個列的數據。另外,若是列上有一個索引,有些數據庫可能可以使用該查詢的索引,即便它是LIKE
查詢。
=
使用'='運算符進行不區分大小寫的精確匹配。例如,若是search_fields
設置爲 而且用戶搜索 ,則Django將執行與此SQL 子句等效的操做 :['=first_name', '=last_name']
john lennon
WHERE
WHERE (first_name ILIKE 'john' OR last_name ILIKE 'john')
AND (first_name ILIKE 'lennon' OR last_name ILIKE 'lennon')
請注意,查詢輸入由空格分隔,所以,在此示例以後,目前沒法搜索first_name
徹底(包含空格)的全部記錄 。'john winston'
@
若是您須要自定義搜索,則可使用它 ModelAdmin.get_search_results()
來提供其餘或替代搜索行爲。
ModelAdmin.
show_full_result_count
¶
設置show_full_result_count
爲控制是否應在過濾的管理頁面上顯示對象的完整數量(例如)。若是此選項設置爲, 則會顯示相似文字。99 results (103 total)
False
99 results (Show all)
show_full_result_count=True
若是表包含大量行,則默認狀況下會生成一個查詢以在表上執行完整計數,這可能很是昂貴。
ModelAdmin.
view_on_site
¶
設置view_on_site
爲控制是否顯示「查看現場」連接。這個連接應該帶你到一個URL,你能夠顯示保存的對象。
該值能夠是布爾標誌或可調用的。若是True
(默認),該對象的get_absolute_url()
方法將用於生成url。
若是您的模型有一個get_absolute_url()
方法,但不想顯示「查看現場」按鈕,則只需設置 view_on_site
爲False
:
from django.contrib import admin
class PersonAdmin(admin.ModelAdmin):
view_on_site = False
若是它是可調用的,它將接受模型實例做爲參數。例如:
from django.contrib import admin
from django.urls import reverse
class PersonAdmin(admin.ModelAdmin):
def view_on_site(self, obj):
url = reverse('person-detail', kwargs={'slug': obj.slug})
return 'https://example.com' + url
該重寫管理模板部分介紹如何重寫或擴展默認的管理模板。使用如下選項覆蓋ModelAdmin
視圖使用的默認模板:
ModelAdmin.
add_form_template
¶
自定義模板的路徑,由其使用add_view()
。
ModelAdmin.
change_form_template
¶
自定義模板的路徑,由其使用change_view()
。
ModelAdmin.
change_list_template
¶
自定義模板的路徑,由其使用changelist_view()
。
ModelAdmin.
delete_confirmation_template
¶
自定義模板的路徑,用於delete_view()
在刪除一個或多個對象時顯示確認頁面。
ModelAdmin.
delete_selected_confirmation_template
¶
自定義模板的路徑,delete_selected
在刪除一個或多個對象時由action方法用於顯示確認頁面。請參閱操做文檔。
ModelAdmin.
object_history_template
¶
自定義模板的路徑,由其使用history_view()
。
ModelAdmin.
popup_response_template
¶
路徑的自定義模板,經過使用response_add()
, response_change()
和response_delete()
。
ModelAdmin
方法¶警告
當重寫ModelAdmin.save_model()
和 ModelAdmin.delete_model()
,你的代碼必須保存/刪除對象。它們不是用於否決的目的,而是容許你執行額外的操做。
ModelAdmin.
save_model
(
request
,
obj
,
form
,
change
)
[source]
¶
該save_model
方法根據是添加仍是更改對象HttpRequest
,給出模型實例,ModelForm
實例和布爾值。覆蓋此方法能夠執行保存前或保存後的操做。調用super().save_model()
以保存使用的對象Model.save()
。
例如,request.user
要在保存以前附加到對象:
from django.contrib import admin
class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.user = request.user
super(ArticleAdmin, self).save_model(request, obj, form, change)
ModelAdmin.
delete_model
(
request
,
obj
)
[source]
¶
該delete_model
方法給出了HttpRequest
一個模型實例。重寫此方法能夠執行預刪除操做。調用super().delete_model()
以刪除使用的對象 Model.delete()
。
ModelAdmin.
save_formset
(
request
,
form
,
formset
,
change
)
[source]
¶
該save_formset
方法根據是否添加或更改父對象給出HttpRequest
父 ModelForm
實例和布爾值。
例如,要附加request.user
到每一個更改的formset模型實例:
class ArticleAdmin(admin.ModelAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for obj in formset.deleted_objects:
obj.delete()
for instance in instances:
instance.user = request.user
instance.save()
formset.save_m2m()
另請參見保存表單集中的對象。
ModelAdmin.
get_ordering
(
請求
)
¶
該get_ordering
方法採用request
as參數,而且預期會返回一個list
或tuple
與該ordering
屬性相似的排序。例如:
class PersonAdmin(admin.ModelAdmin):
def get_ordering(self, request):
if request.user.is_superuser:
return ['name', 'rank']
else:
return ['name']
ModelAdmin.
get_search_results
(
request
,
queryset
,
search_term
)
[source]
¶
該get_search_results
方法將顯示的對象列表修改成與提供的搜索項匹配的對象列表。它接受請求,應用當前過濾器的查詢集以及用戶提供的搜索術語。它返回一個包含被修改來實現搜索的查詢集的元組,以及一個指示結果是否包含重複項的布爾值。
默認實現搜索名爲in的字段ModelAdmin.search_fields
。
此方法可能會被您本身的自定義搜索方法覆蓋。例如,您可能但願按整數字段進行搜索,或使用外部工具(如Solr或Haystack)。您必須肯定您的搜索方法實施的查詢集更改是否可能會在結果中引入重複項,並返回True
返回值的第二個元素。
例如,要經過name
和進行搜索age
,您可使用:
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age')
search_fields = ('name',)
def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
try:
search_term_as_int = int(search_term)
except ValueError:
pass
else:
queryset |= self.model.objects.filter(age=search_term_as_int)
return queryset, use_distinct
這個實現比致使字符串比較數字字段的效率更高,例如 PostgreSQL。search_fields = ('name', '=age')
... OR UPPER("polls_choice"."votes"::text) = UPPER('4')
ModelAdmin.
save_related
(
request
,
form
,
formsets
,
change
)
[source]
¶
該save_related
方法根據是否正在添加或更改HttpRequest
父項ModelForm
,給出父級 實例,內聯窗體集列表和布爾值。在這裏,您能夠爲與父項相關的對象執行任何預保存或後保存操做。請注意,此時父對象及其表單已被保存。
ModelAdmin.
get_readonly_fields
(
request
,
obj = None
)
¶
該get_readonly_fields
方法被賦予HttpRequest
和 obj
正在編輯(或None
添加表單),而且預期會返回一個list
或tuple
多個字段名稱,這些名稱將按照只讀方式顯示,如上面的ModelAdmin.readonly_fields
部分所述。
ModelAdmin.
get_prepopulated_fields
(
request
,
obj = None
)
¶
該get_prepopulated_fields
方法被賦予HttpRequest
和 obj
正在編輯(或None
在添加表單上),而且預期會返回一個dictionary
,如上面的ModelAdmin.prepopulated_fields
部分所述。
ModelAdmin.
get_list_display
(
請求
)
[源]
¶
該get_list_display
方法給出的HttpRequest
和預期返回一個list
或tuple
將如上述所描述的變動列表視圖中顯示的字段名的 ModelAdmin.list_display
段。
ModelAdmin.
get_list_display_links
(
request
,
list_display
)
[source]
¶
該get_list_display_links
方法被賦予HttpRequest
和由list
或tuple
返回ModelAdmin.get_list_display()
。預計返回任一None
或一個list
或tuple
字段名稱的對將被連接到的變化視圖,如在所描述的變動表ModelAdmin.list_display_links
部分。
ModelAdmin.
get_exclude
(
request
,
obj = None
)
¶
該get_exclude
方法被賦予HttpRequest
和obj
正在編輯(或None
添加表單),而且預期返回一個字段列表,以下所述ModelAdmin.exclude
。
ModelAdmin.
get_fields
(
request
,
obj = None
)
[source]
¶
該get_fields
方法被賦予HttpRequest
和obj
正在編輯(或None
添加表單),而且預期會返回一個字段列表,如上面的ModelAdmin.fields
部分所述。
ModelAdmin.
get_fieldsets
(
request
,
obj = None
)
¶
該get_fieldsets
方法被賦予HttpRequest
和obj
被編輯(或None
添加表單),而且預期返回一個兩元組列表,其中每一個二元組表示一個<fieldset>
在管理表單頁面上的,如上面在本ModelAdmin.fieldsets
節中所述。
ModelAdmin.
get_list_filter
(
請求
)
[源]
¶
該get_list_filter
方法給出HttpRequest
而且有望恢復同種序列類型做爲 list_filter
屬性。
ModelAdmin.
get_list_select_related
(
請求
)
[源]
¶
該get_list_select_related
方法給出的HttpRequest
和應該返回一個布爾值或列表ModelAdmin.list_select_related
同樣。
ModelAdmin.
get_search_fields
(
請求
)
[源]
¶
該get_search_fields
方法給出HttpRequest
而且有望恢復同種序列類型做爲 search_fields
屬性。
ModelAdmin.
get_inline_instances
(
request
,
obj = None
)
[source]
¶
該get_inline_instances
方法被賦予HttpRequest
和 obj
正在編輯(或None
添加表單),而且預期會返回一個list
或tuple
多個InlineModelAdmin
對象,以下面的InlineModelAdmin
部分所述。例如,如下內容將根據添加,更改和刪除權限在沒有默認篩選的狀況下返回內聯:
class MyModelAdmin(admin.ModelAdmin):
inlines = (MyInline,)
def get_inline_instances(self, request, obj=None):
return [inline(self.model, self.admin_site) for inline in self.inlines]
若是您重寫此方法,請確保返回的內聯是在其中定義的類的實例,inlines
或者在添加相關對象時可能會遇到「錯誤的請求」錯誤。
ModelAdmin.
get_urls
()
[source]
¶
在get_urls
上一個方法ModelAdmin
返回到用於以相同的方式做爲URL配置其的ModelAdmin的網址。所以,您能夠按照URL調度程序中的說明擴展它們:
class MyModelAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super(MyModelAdmin, self).get_urls()
my_urls = [
url(r'^my_view/$', self.my_view),
]
return my_urls + urls
def my_view(self, request):
# ...
context = dict(
# Include common variables for rendering the admin template.
self.admin_site.each_context(request),
# Anything else you want in the context...
key=value,
)
return TemplateResponse(request, "sometemplate.html", context)
若是您想使用管理佈局,請從admin/base_site.html
如下位置擴展:
{% extends "admin/base_site.html" %}
{% block content %}
...
{% endblock %}
注意
請注意,自定義模式包含在常規管理網址以前:管理網址模式很是寬容,幾乎能夠匹配任何內容,所以您一般會但願將自定義網址預置爲內置網址。
在這個例子中,my_view
將被訪問 /admin/myapp/mymodel/my_view/
(假設管理網址包含在/admin/
。)
可是,self.my_view
上面註冊的功能存在兩個問題:
因爲這一般不是你想要的,Django提供了一個方便的包裝來檢查權限並將視圖標記爲不可緩存。這個包裝是AdminSite.admin_view()
(即self.admin_site.admin_view
在一個ModelAdmin
實例內); 像這樣使用它:
class MyModelAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super(MyModelAdmin, self).get_urls()
my_urls = [
url(r'^my_view/$', self.admin_site.admin_view(self.my_view))
]
return my_urls + urls
注意上面第五行的包裝視圖:
url(r'^my_view/$', self.admin_site.admin_view(self.my_view))
這個包裝將防止self.my_view
未經受權的訪問,並將應用django.views.decorators.cache.never_cache()
裝飾器,以確保若是緩存中間件處於活動狀態,則不會緩存它。
若是頁面可緩存,但您仍但願執行權限檢查,則能夠將cacheable=True
參數傳遞給 AdminSite.admin_view()
:
url(r'^my_view/$', self.admin_site.admin_view(self.my_view, cacheable=True))
ModelAdmin
視圖具備model_admin
屬性。其餘 AdminSite
視圖具備admin_site
屬性。
ModelAdmin.
get_form
(
request
,
obj = None
,
** kwargs
)
[source]
¶
返回一個ModelForm
用於管理添加和更改視圖的類,請參閱add_view()
和change_view()
。
基本實現使用modelform_factory()
子類form
,經過fields
和等屬性進行修改exclude
。所以,例如,若是您想爲超級用戶提供其餘字段,則可使用不一樣的基本形式,以下所示:
class MyModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
kwargs['form'] = MySuperuserForm
return super(MyModelAdmin, self).get_form(request, obj, **kwargs)
您也能夠直接返回一個自定義ModelForm
類。
ModelAdmin.
get_formsets_with_inlines
(
request
,
obj = None
)
[source]
¶
產量(FormSet
,InlineModelAdmin
)配對用於管理添加和更改視圖。
例如,若是您只想在更改視圖中顯示特定的內聯,則能夠覆蓋get_formsets_with_inlines
,以下所示:
class MyModelAdmin(admin.ModelAdmin):
inlines = [MyInline, SomeOtherInline]
def get_formsets_with_inlines(self, request, obj=None):
for inline in self.get_inline_instances(request, obj):
# hide MyInline in the add view
if isinstance(inline, MyInline) and obj is None:
continue
yield inline.get_formset(request, obj), inline
ModelAdmin.
formfield_for_foreignkey
(
db_field
,
request
,
** kwargs
)
¶
a上的formfield_for_foreignkey
方法ModelAdmin
容許您覆蓋外鍵字段的默認窗體字段。例如,要根據用戶返回此外鍵字段的對象的子集:
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "car":
kwargs["queryset"] = Car.objects.filter(owner=request.user)
return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
這將使用HttpRequest
實例來過濾Car
外鍵字段以僅顯示User
實例擁有的汽車。
ModelAdmin.
formfield_for_manytomany
(
db_field
,
request
,
** kwargs
)
¶
就像這個formfield_for_foreignkey
方法同樣,這個 formfield_for_manytomany
方法能夠被覆蓋,爲多到多的字段更改默認的表單域。例如,若是擁有者能夠擁有多輛汽車,而且汽車能夠屬於多個全部者 - 多對多關係 - 那麼您能夠過濾Car
外鍵字段以僅顯示如下內容擁有的汽車User
:
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "cars":
kwargs["queryset"] = Car.objects.filter(owner=request.user)
return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
ModelAdmin.
formfield_for_choice_field
(
db_field
,
request
,
** kwargs
)
¶
像formfield_for_foreignkey
和和formfield_for_manytomany
方法同樣,formfield_for_choice_field
能夠重寫該方法來更改已聲明選項的字段的默認表單域。例如,若是超級用戶可用的選擇不一樣於普通員工可用的選擇,則可按如下步驟操做:
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_choice_field(self, db_field, request, **kwargs):
if db_field.name == "status":
kwargs['choices'] = (
('accepted', 'Accepted'),
('denied', 'Denied'),
)
if request.user.is_superuser:
kwargs['choices'] += (('ready', 'Ready for deployment'),)
return super(MyModelAdmin, self).formfield_for_choice_field(db_field, request, **kwargs)
注意
choices
在formfield上設置的任何屬性將僅限於表單域。若是模型上的相應字段設置了選項,則提供給表單的選項必須是這些選項的有效子集,不然表單提交將失敗,而且ValidationError
在保存前驗證模型自己。
ModelAdmin.
get_changelist
(
請求
,
** kwargs
)
[源代碼]
¶
返回Changelist
要用於列表的類。默認狀況下, django.contrib.admin.views.main.ChangeList
使用。經過繼承這個類,你能夠改變列表的行爲。
ModelAdmin.
get_changelist_form
(
請求
,
** kwargs
)
[源代碼]
¶
返回 在更改列表頁面上ModelForm
使用的類Formset
。要使用自定義表單,例如:
from django import forms
class MyForm(forms.ModelForm):
pass
class MyModelAdmin(admin.ModelAdmin):
def get_changelist_form(self, request, **kwargs):
return MyForm
注意
若是您Meta.model
在a上定義屬性 ModelForm
,則還必須定義 Meta.fields
屬性(或Meta.exclude
屬性)。然而, ModelAdmin
忽略這個值,用ModelAdmin.list_editable
屬性覆蓋它 。最簡單的解決方案是省略該Meta.model
屬性,由於ModelAdmin
它將提供正確的模型以供使用。
ModelAdmin.
get_changelist_formset
(
請求
,
** kwargs
)
[源代碼]
¶
若是使用的話,返回一個ModelFormSet類用於更改列表頁面list_editable
。要使用自定義表單,例如:
from django.forms import BaseModelFormSet
class MyAdminFormSet(BaseModelFormSet):
pass
class MyModelAdmin(admin.ModelAdmin):
def get_changelist_formset(self, request, **kwargs):
kwargs['formset'] = MyAdminFormSet
return super(MyModelAdmin, self).get_changelist_formset(request, **kwargs)
ModelAdmin.
lookup_allowed
(
lookup
,
value
)
¶
更改列表頁面中的對象可使用來自URL的查詢字符串的查找進行過濾。list_filter
例如,這是如何工做的。查找與QuerySet.filter()
(例如 user__email=user@example.com
)中使用的類似。因爲查詢字符串中的查找能夠由用戶操做,所以必須對其進行消毒以防止未經受權的數據暴露。
該lookup_allowed()
方法從查詢字符串(例如'user__email'
)和相應的值(例如'user@example.com'
)給出一個查找路徑,並返回一個布爾值,指示是否QuerySet
容許使用參數過濾更改列表。若是lookup_allowed()
返回False
,則引起DisallowedModelAdminLookup
(的子類SuspiciousOperation
)。
默認狀況下,lookup_allowed()
容許訪問模型的本地字段,list_filter
(但不包括路徑 get_list_filter()
)中使用的字段路徑以及limit_choices_to
正確運行所需的查找 raw_id_fields
。
重寫此方法以自定義您的ModelAdmin
子類容許的查找 。
ModelAdmin.
has_add_permission
(
請求
)
¶
True
若是添加一個對象應該返回,False
不然。
ModelAdmin.
has_change_permission
(
request
,
obj = None
)
¶
True
若是編輯obj被容許,應該返回,False
不然。若是obj是None
,應返回True
或False
指示是否容許一般容許編輯此類對象(例如,False
將被解釋爲意味着當前用戶不被容許編輯此類型的任何對象)。
ModelAdmin.
has_delete_permission
(
request
,
obj = None
)
¶
True
若是刪除obj被容許,應該返回,False
不然。若是obj是None
,應返回True
或False
指示是否容許刪除此類型的對象(例如,False
將被解釋爲意味着當前用戶不容許刪除此類型的任何對象)。
ModelAdmin.
has_module_permission
(
請求
)
¶
若是True
在管理索引頁面上顯示模塊並訪問模塊的索引頁面應該返回,False
不然返回。使用User.has_module_perms()
默認。重寫它不限制訪問添加,更改或刪除意見, has_add_permission()
, has_change_permission()
,和 has_delete_permission()
應該用於這一點。
ModelAdmin.
get_queryset
(
請求
)
¶
返回 能夠由管理站點編輯的全部模型實例的get_queryset
方法。覆蓋此方法的一個用例是顯示登陸用戶擁有的對象:ModelAdmin
QuerySet
class MyModelAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(MyModelAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(author=request.user)
ModelAdmin.
message_user
(
request
,
message
,
level = messages.INFO
,
extra_tags =''
,
fail_silently = False
)
[source]
¶
使用django.contrib.messages
後端向用戶發送消息。請參閱自定義的ModelAdmin示例。
關鍵字參數容許您更改消息級別,添加額外的CSS標籤,或者若是contrib.messages
未安裝框架,將自動失敗。這些關鍵字參數與之匹配 django.contrib.messages.add_message()
,請參閱該函數的文檔以獲取更多詳細信息。一個區別是,除了整數/常量以外,該級別還能夠做爲字符串標籤傳遞。
ModelAdmin.
get_paginator
(
request
,
queryset
,
per_page
,
orphans = 0
,
allow_empty_first_page = True
)
[source]
¶
返回用於此視圖的分頁程序實例。默認狀況下,實例化一個實例paginator
。
ModelAdmin.
response_add
(
request
,
obj
,
post_url_continue = None
)
[source]
¶
肯定HttpResponse
的 add_view()
階段。
response_add
在提交管理員表單後以及在建立和保存對象和全部相關實例以後調用。您能夠覆蓋它以更改對象建立後的默認行爲。
ModelAdmin.
response_change
(
request
,
obj
)
[source]
¶
肯定HttpResponse
的 change_view()
階段。
response_change
在提交管理表單而且剛剛保存了對象和全部相關實例以後調用。您能夠覆蓋它以更改對象更改後的默認行爲。
ModelAdmin.
response_delete
(
request
,
obj_display
,
obj_id
)
[source]
¶
肯定HttpResponse
的 delete_view()
階段。
response_delete
在對象被刪除後調用。您能夠覆蓋它以更改對象刪除後的默認行爲。
obj_display
是一個帶有刪除對象名稱的字符串。
obj_id
是用於檢索要刪除的對象的序列化標識符。
ModelAdmin.
get_changeform_initial_data
(
請求
)
[源]
¶
管理員更改表單上的初始數據的掛鉤。默認狀況下,字段從GET
參數中得到初始值。例如, ?name=initial_value
將name
字段的初始值設置爲 initial_value
。
這個方法應該如下面的形式返回一個字典 :{'fieldname': 'fieldval'}
def get_changeform_initial_data(self, request):
return {'name': 'custom_initial_value'}
ModelAdmin.
add_view
(
request
,
form_url =''
,
extra_context = None
)
[source]
¶
用於模型實例添加頁面的Django視圖。見下面的註釋。
ModelAdmin.
change_view
(
request
,
object_id
,
form_url =''
,
extra_context = None
)
[source]
¶
用於模型實例編輯頁面的Django視圖。見下面的註釋。
ModelAdmin.
changelist_view
(
request
,
extra_context = None
)
[source]
¶
用於模型實例的Django視圖更改列表/操做頁面。見下面的註釋。
ModelAdmin.
delete_view
(
request
,
object_id
,
extra_context = None
)
[source]
¶
用於模型實例刪除確認頁面的Django視圖。見下面的註釋。
ModelAdmin.
history_view
(
request
,
object_id
,
extra_context = None
)
[source]
¶
顯示給定模型實例的修改歷史記錄的頁面的Django視圖。
與ModelAdmin
上一節中詳述的鉤子類型方法不一樣,這五種方法實際上被設計爲從管理應用程序URL分派處理程序調用爲Django視圖來呈現處理模型實例CRUD操做的頁面。所以,徹底覆蓋這些方法將顯着改變管理應用程序的行爲。
覆蓋這些方法的一個常見緣由是增長提供給呈現視圖的模板的上下文數據。在如下示例中,將更改視圖被覆蓋,以便爲呈現的模板提供一些額外的映射數據,不然這些映射數據不可用:
class MyModelAdmin(admin.ModelAdmin):
# A template for a very customized change view:
change_form_template = 'admin/myapp/extras/openstreetmap_change_form.html'
def get_osm_info(self):
# ...
pass
def change_view(self, request, object_id, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['osm_data'] = self.get_osm_info()
return super(MyModelAdmin, self).change_view(
request, object_id, form_url, extra_context=extra_context,
)
這些視圖返回的TemplateResponse
實例容許您在呈現前輕鬆定製響應數據。有關更多詳細信息,請參閱TemplateResponse文檔。
ModelAdmin
資產定義¶有些時候您想添加一些CSS和/或JavaScript到添加/更改視圖。這能夠經過Media
在你的下面使用一個內部類來完成ModelAdmin
:
class ArticleAdmin(admin.ModelAdmin):
class Media:
css = {
"all": ("my_styles.css",)
}
js = ("my_code.js",)
所述staticfiles應用預規劃 STATIC_URL
(或MEDIA_URL
若是STATIC_URL
是 None
),以任何資產路徑。與表格上的常規資產定義相同的規則也適用。
Django管理JavaScript使用jQuery庫。
爲了不與用戶提供的腳本或庫衝突,Django的jQuery(版本2.2.3)命名空間爲django.jQuery
。若是您想在本身的管理JavaScript中使用jQuery而不包含第二個副本,則能夠django.jQuery
在更改列表上使用該 對象並添加/編輯視圖。
嵌入式jQuery從2.1.4升級到2.2.3。
本ModelAdmin
類須要jQuery的默認,因此沒有必要將jQuery添加到您的ModelAdmin
「媒體資源的名單,除非你有特殊的須要。例如,若是您須要將jQuery庫放在全局名稱空間中(例如,使用第三方jQuery插件時)或者須要更新版本的jQuery,則必須包含本身的副本。
Django提供未壓縮和jQuery的「精縮」版本, jquery.js
和jquery.min.js
分別。
ModelAdmin
並InlineModelAdmin
有一個media
屬性返回Media
存儲指向表單和/或表單集的JavaScript文件路徑的對象列表。若是DEBUG
是True
,將返回不一樣的JavaScript文件,其中包括未壓縮的版本 jquery.js
; 若是不是,它將返回'縮小'版本。
在管理員中添加自定義數據驗證很是簡單。自動管理界面重用django.forms
,而且ModelAdmin
該類讓您能夠定義本身的表單:
class ArticleAdmin(admin.ModelAdmin):
form = MyArticleAdminForm
MyArticleAdminForm
能夠在任何地方定義,只要您在須要的地方導入便可。如今在表單中,您能夠爲任何字段添加您本身的自定義驗證:
class MyArticleAdminForm(forms.ModelForm):
def clean_name(self):
# do something that validates your data
return self.cleaned_data["name"]
你在ModelForm
這裏使用這一點很重要,不然事情可能會破裂。請參閱自定義驗證的表單文檔,更具體來講,請參閱 模型表單驗證說明以獲取更多信息。
InlineModelAdmin
對象¶InlineModelAdmin
¶
StackedInline
[source]
¶
管理界面能夠在與父模型相同的頁面上編輯模型。這些被稱爲內聯。假設你有這兩個模型:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
您能夠編輯做者頁面上做者創做的書籍。經過在模型中指定它們,能夠將內聯添加到模型中ModelAdmin.inlines
:
from django.contrib import admin
class BookInline(admin.TabularInline):
model = Book
class AuthorAdmin(admin.ModelAdmin):
inlines = [
BookInline,
]
Django提供了兩個子類,InlineModelAdmin
它們是:
這二者之間的區別僅僅是用於呈現它們的模板。
InlineModelAdmin
選項¶InlineModelAdmin
與許多相同的功能ModelAdmin
共享,並增長了一些功能(共享功能其實是在BaseModelAdmin
超類中定義的 )。共享功能是:
form
fieldsets
fields
formfield_overrides
exclude
filter_horizontal
filter_vertical
ordering
prepopulated_fields
get_queryset()
radio_fields
readonly_fields
raw_id_fields
formfield_for_choice_field()
formfield_for_foreignkey()
formfield_for_manytomany()
has_add_permission()
has_change_permission()
has_delete_permission()
has_module_permission()
該InlineModelAdmin
班增長:
InlineModelAdmin.
model
¶
內聯使用的模型。這是必需的。
InlineModelAdmin.
fk_name
¶
模型上外鍵的名稱。在大多數狀況下,這將自動處理,但fk_name
若是同一父模型有多個外鍵,則必須明確指定。
InlineModelAdmin.
formset
¶
這默認爲BaseInlineFormSet
。使用你本身的formset能夠給你不少定製的可能性。內聯是圍繞模型框架構建的。
InlineModelAdmin.
form
¶
該值form
默認爲ModelForm
。這是inlineformset_factory()
爲內聯建立formset時傳遞的內容。
警告
在爲InlineModelAdmin
窗體編寫自定義驗證時,請謹慎編寫依賴父模型功能的驗證。若是父模型沒法驗證,則可能會使其處於不一致狀態,如ModelForm上的驗證中的警告中所述。
InlineModelAdmin.
classes
¶
包含額外CSS類的列表或元組,用於應用於爲內聯呈現的字段集。默認爲None
。與配置fieldsets
的collapse
類同樣,內聯的類將首先被摺疊,而且它們的標題將會有一個小的「顯示」連接。
InlineModelAdmin.
extra
¶
除了初始表單以外,它控制着formset將顯示的額外表單的數量。有關更多信息,請參閱 formset文檔。
對於啓用了JavaScript的瀏覽器的用戶,提供了「添加另外一個」連接,除了做爲extra
參數提供的內容以外,還能夠添加任意數量的附加內聯。
若是當前顯示的表單數量超過max_num
,或者用戶沒有啓用JavaScript,則動態連接不會顯示。
InlineModelAdmin.get_extra()
還容許您自定義額外表格的數量。
InlineModelAdmin.
max_num
¶
這將控制內聯中顯示的最大表單數量。這並不直接與對象的數量相關,但若是值足夠小,則可使用。請參閱限制可編輯對象的數量以獲取更多信息。
InlineModelAdmin.get_max_num()
還容許您自定義額外表格的最大數量。
InlineModelAdmin.
min_num
¶
這控制了要在內聯中顯示的最少數量的表單。查看modelformset_factory()
更多信息。
InlineModelAdmin.get_min_num()
還容許您自定義顯示錶單的最小數量。
InlineModelAdmin.
raw_id_fields
¶
默認狀況下,Django的管理員使用選擇框界面(<select>)來顯示字段ForeignKey
。有時你不想承擔必須選擇全部相關實例以顯示在下拉菜單中的開銷。
raw_id_fields
是您想要更改成Input
a ForeignKey
或小部件的字段列表 ManyToManyField
:
class BookInline(admin.TabularInline):
model = Book
raw_id_fields = ("pages",)
InlineModelAdmin.
template
¶
用於在頁面上呈現內聯的模板。
InlineModelAdmin.
verbose_name
¶
verbose_name
在模型的內部Meta
類中找到的重寫。
InlineModelAdmin.
verbose_name_plural
¶
verbose_name_plural
在模型的內部Meta
類中找到 的重寫。
InlineModelAdmin.
can_delete
¶
指定是否能夠內嵌刪除嵌入式對象。默認爲True
。
InlineModelAdmin.
show_change_link
¶
指定是否能夠在admin中更改的內嵌對象連接到更改表單。默認爲False
。
InlineModelAdmin.
get_formset
(
request
,
obj = None
,
** kwargs
)
¶
返回一個BaseInlineFormSet
用於管理員添加/更改視圖的類。看到的例子 ModelAdmin.get_formsets_with_inlines
。
InlineModelAdmin.
get_extra
(
request
,
obj = None
,
** kwargs
)
¶
返回要使用的額外內聯表單的數量。默認狀況下,返回 InlineModelAdmin.extra
屬性。
重寫此方法以編程方式肯定額外內聯表單的數量。例如,這可能基於模型實例(做爲關鍵字參數傳遞obj
):
class BinaryTreeAdmin(admin.TabularInline):
model = BinaryTree
def get_extra(self, request, obj=None, **kwargs):
extra = 2
if obj:
return extra - obj.binarytree_set.count()
return extra
InlineModelAdmin.
get_max_num
(
request
,
obj = None
,
** kwargs
)
¶
返回要使用的額外內聯表單的最大數量。默認狀況下,返回InlineModelAdmin.max_num
屬性。
重寫此方法以編程方式肯定內聯表單的最大數量。例如,這可能基於模型實例(做爲關鍵字參數傳遞obj
):
class BinaryTreeAdmin(admin.TabularInline):
model = BinaryTree
def get_max_num(self, request, obj=None, **kwargs):
max_num = 10
if obj and obj.parent:
return max_num - 5
return max_num
InlineModelAdmin.
get_min_num
(
request
,
obj = None
,
** kwargs
)
¶
返回要使用的內聯表單的最小數量。默認狀況下,返回InlineModelAdmin.min_num
屬性。
重寫此方法以編程方式肯定內聯表單的最小數量。例如,這可能基於模型實例(做爲關鍵字參數傳遞obj
)。
有時可能有多個外鍵用於同一模型。以這個模型爲例:
from django.db import models
class Friendship(models.Model):
to_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="friends")
from_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="from_friends")
若是您想要在Person
管理添加/更改頁面上顯示內聯,則須要顯式定義外鍵,由於它沒法自動執行:
from django.contrib import admin
from myapp.models import Friendship
class FriendshipInline(admin.TabularInline):
model = Friendship
fk_name = "to_person"
class PersonAdmin(admin.ModelAdmin):
inlines = [
FriendshipInline,
]
默認狀況下,多對多關係的管理小部件將顯示在任何包含實際引用的模型上 ManyToManyField
。根據您的ModelAdmin
定義,模型中的每一個多對多字段將由標準HTML ,水平或垂直過濾器或 小部件表示。可是,也能夠用內聯替換這些小部件。<select multiple>
raw_id_admin
假設咱們有如下模型:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, related_name='groups')
若是要使用內聯顯示多對多關係,能夠經過定義InlineModelAdmin
關係的對象來實現:
from django.contrib import admin
class MembershipInline(admin.TabularInline):
model = Group.members.through
class PersonAdmin(admin.ModelAdmin):
inlines = [
MembershipInline,
]
class GroupAdmin(admin.ModelAdmin):
inlines = [
MembershipInline,
]
exclude = ('members',)
在這個例子中有兩個值得注意的特徵。
首先 - MembershipInline
類參考Group.members.through
。該through
屬性是對管理多對多關係的模型的引用。當您定義多對多字段時,此模型由Django自動建立。
其次,GroupAdmin
必須手動排除該members
字段。Django在定義關係的模型上顯示一個多對多字段的管理小部件(在這種狀況下Group
)。若是您想使用內聯模型來表示多對多關係,那麼您必須告訴Django的管理員不要顯示此小部件 - 不然您將在管理頁面上以管理關係的方式結束兩個小部件。
請注意,使用這種技術時, m2m_changed
信號不會被觸發。這是由於就管理員而言,through
只是一個有兩個外鍵字段而不是多對多關係的模型。
在全部其餘方面,這與其餘方面InlineModelAdmin
徹底相同。您可使用任何常規ModelAdmin
屬性自定義外觀 。
當您使用through
參數 指定中介模型時ManyToManyField
,管理員默認不會顯示小部件。這是由於該中介模型的每一個實例都須要比能夠在單個窗口小部件中顯示的信息更多的信息,而且多個窗口小部件所需的佈局會因中間模型而異。
可是,咱們仍然但願可以內聯編輯該信息。幸運的是,這對於內聯管理員模型很容易。假設咱們有如下模型:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
在管理中顯示這個中間模型的第一步是爲模型定義一個內聯類Membership
:
class MembershipInline(admin.TabularInline):
model = Membership
extra = 1
這個簡單的示例使用模型的默認InlineModelAdmin
值 Membership
,並將額外的添加表單限制爲一個。這可使用InlineModelAdmin
課程提供的任何選項進行定製。
如今爲這些Person
和Group
模型建立管理員視圖:
class PersonAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)
class GroupAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)
最後,註冊Person
和Group
使用管理網站的型號:
admin.site.register(Person, PersonAdmin)
admin.site.register(Group, GroupAdmin)
如今,您的管理網站已設置爲能夠Membership
從內容Person
或Group
詳細信息頁面內聯編輯對象。
可使用與通常相關對象的內聯。假設您有如下型號:
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
class Image(models.Model):
image = models.ImageField(upload_to="images")
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey("content_type", "object_id")
class Product(models.Model):
name = models.CharField(max_length=100)
若是你想容許編輯和建立一個Image
實例 Product
,你可使用添加/更改視圖, GenericTabularInline
或者提供的GenericStackedInline
((的兩個子類GenericInlineModelAdmin
))admin
。它們分別爲表明內聯對象的表單實現表格式和堆疊式可視化佈局,就像它們的非通用對象同樣。他們的行爲與其餘任何內聯行爲同樣。在你admin.py
的這個示例應用程序中:
from django.contrib import admin
from django.contrib.contenttypes.admin import GenericTabularInline
from myproject.myapp.models import Image, Product
class ImageInline(GenericTabularInline):
model = Image
class ProductAdmin(admin.ModelAdmin):
inlines = [
ImageInline,
]
admin.site.register(Product, ProductAdmin)
有關更多特定信息,請參閱contenttypes文檔。
覆蓋管理模塊用於生成管理站點各類頁面的許多模板相對比較容易。您甚至能夠爲特定的應用程序或特定的模型覆蓋這些模板中的一部分。
管理員模板文件位於contrib/admin/templates/admin
目錄中。
爲了覆蓋它們中的一個或多個,首先admin
在項目目錄中建立一個templates
目錄。這能夠是您在設置DIRS
中的DjangoTemplates
後端選項中 指定的任何目錄TEMPLATES
。若是您已經自定義了該'loaders'
選項,請務必 'django.template.loaders.filesystem.Loader'
在以前出現, 'django.template.loaders.app_directories.Loader'
以便您的自定義模板將由模板加載系統找到以前的模板加載系統找到django.contrib.admin
。
在此admin
目錄中,建立以應用程序命名的子目錄。在這些應用程序子目錄中建立以您的模型命名的子目錄。請注意,當查找目錄時,管理應用程序將小寫模型名稱,所以,若是要在區分大小寫的文件系統上運行應用程序,請確保以所有小寫命名該目錄。
要覆蓋特定應用程序的管理員模板,請從該django/contrib/admin/templates/admin
目錄複製並編輯模板,並將其保存到您剛建立的其中一個目錄中。
例如,若是咱們想要將一個工具添加到名爲app的全部模型的變動列表視圖中my_app
,咱們將複製 contrib/admin/templates/admin/change_list.html
到templates/admin/my_app/
咱們項目的 目錄中,並進行必要的更改。
若是咱們只想爲名爲'Page'的特定模型添加一個工具到變動列表視圖,咱們會將同一個文件複製到templates/admin/my_app/page
咱們項目的 目錄中。
因爲管理模板的模塊化設計,替換整個模板一般既沒必要要也不可取。只覆蓋模板中須要更改的部分幾乎老是更好。
要繼續上面的示例,咱們但願在History
該Page
模型的工具旁邊添加一個新連接 。看完後change_form.html
咱們肯定咱們只須要重寫該object-tools-items
塊。因此這裏是咱們的新東西change_form.html
:
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block object-tools-items %}
<li>
<a href="{% url opts|admin_urlname:'history' original.pk|admin_urlquote %}" class="historylink">{% trans "History" %}</a>
</li>
<li>
<a href="mylink/" class="historylink">My Link</a>
</li>
{% if has_absolute_url %}
<li>
<a href="{% url 'admin:view_on_site' content_type_id original.pk %}" class="viewsitelink">{% trans "View on site" %}</a>
</li>
{% endif %}
{% endblock %}
就是這樣!若是咱們將這個文件放在templates/admin/my_app
目錄中,咱們的連接將出如今my_app中全部模型的更改表單上。
並不是每一個模板都contrib/admin/templates/admin
可能被每一個應用或每一個模型覆蓋。如下內容能夠:
app_index.html
change_form.html
change_list.html
delete_confirmation.html
object_history.html
popup_response.html
popup_response.html
添加了覆蓋模板的功能。
對於那些沒法以這種方式覆蓋的模板,您可能仍然會覆蓋整個項目的模板。只需將新版本放入您的 templates/admin
目錄便可。這對建立自定義404和500頁特別有用。
注意
某些管理模板(如change_list_results.html
用於呈現自定義包含標記)。這些可能會被覆蓋,但在這種狀況下,您最好建立本身的標記版本並給它一個不一樣的名稱。這樣你能夠有選擇地使用它。
若是你想改變索引,登陸或註銷的模板,你最好建立本身的AdminSite
實例(見下文),並更改 AdminSite.index_template
,AdminSite.login_template
或 AdminSite.logout_template
屬性。
AdminSite
對象¶AdminSite
(
name ='admin'
)
[source]
¶
Django管理站點由一個實例表明 django.contrib.admin.sites.AdminSite
; 默認狀況下,該類的一個實例被建立爲django.contrib.admin.site
,您能夠ModelAdmin
使用它註冊模型和實例。
在構建一個實例時AdminSite
,可使用name
構造函數的參數提供惟一的實例名稱。此實例名稱用於標識實例,特別是在 反轉管理URL時。若是未提供實例名稱,admin
則將使用默認實例名稱。有關自定義類的示例, 請參閱自定義AdminSiteAdminSite
類。
AdminSite
屬性¶模板能夠覆蓋或擴展基本管理模板,如 覆蓋管理模板中所述。
AdminSite.
site_header
¶
做爲<h1>
(字符串)放在每一個管理頁面頂部的文本。默認狀況下,這是「Django管理」。
AdminSite.
site_title
¶
將文本放在每一個管理頁面的末尾<title>
(一個字符串)。默認狀況下,這是「Django網站管理員」。
AdminSite.
site_url
¶
每一個管理頁面頂部的「查看網站」連接的網址。默認狀況下 site_url
是/
。將其設置None
爲刪除連接。
對於在子路徑上運行的站點,該each_context()
方法檢查當前請求是否已request.META['SCRIPT_NAME']
設置,若是site_url
沒有設置爲非/
。
SCRIPT_NAME
增長了前一段中描述的支持。
AdminSite.
index_title
¶
放在管理索引頁面頂部的文本(字符串)。默認狀況下,這是「網站管理」。
AdminSite.
index_template
¶
管理網站主索引視圖將使用的自定義模板的路徑。
AdminSite.
app_index_template
¶
管理網站應用程序索引視圖將使用的自定義模板的路徑。
AdminSite.
empty_value_display
¶
用於在管理網站的更改列表中顯示空值的字符串。默認爲短劃線。經過在字段上設置屬性,也能夠ModelAdmin
逐個覆蓋該值並在一個自定義字段中覆蓋該值 。舉例來看 。ModelAdmin
empty_value_display
ModelAdmin.empty_value_display
AdminSite.
login_template
¶
管理網站登陸視圖將使用自定義模板的路徑。
AdminSite.
login_form
¶
AuthenticationForm
那個子類將被管理網站登陸視圖使用。
AdminSite.
logout_template
¶
管理網站註銷視圖將使用的自定義模板的路徑。
AdminSite.
password_change_template
¶
管理站點密碼更改視圖將使用的自定義模板的路徑。
AdminSite.
password_change_done_template
¶
將由管理員站點密碼更改完成視圖使用的自定義模板的路徑。
AdminSite
方法¶AdminSite.
each_context
(
請求
)
[源]
¶
返回管理站點中每一個頁面的模板上下文中的變量字典。
默認包含如下變量和值:
site_header
: AdminSite.site_header
site_title
: AdminSite.site_title
site_url
: AdminSite.site_url
has_permission
: AdminSite.has_permission()
available_apps
:當前用戶可用的應用程序註冊表中的應用程序列表。列表中的每一個條目都是一個表明具備如下鍵的應用程序的字典:
app_label
:應用程序標籤app_url
:管理員中應用程序索引的URLhas_module_perms
:一個布爾值,指示是否容許當前用戶顯示和訪問模塊的索引頁models
:應用程序中可用模型的列表每一個模型都是一個帶有如下鍵的字典:
object_name
:模型的類名稱name
:模型的複數名稱perms
:一個dict
跟蹤add
,change
和delete
權限admin_url
:模型的admin更改列表URLadd_url
:admin URL來添加一個新的模型實例AdminSite.
has_permission
(
請求
)
[源]
¶
返回True
給定用戶HttpRequest
是否有權查看管理站點中的至少一個頁面。默認爲既須要 User.is_active
和 User.is_staff
要 True
。
AdminSite.
register
(
model_or_iterable
,
admin_class = None
,
**選項
)
[source]
¶
給定的模型類(或類的迭代) admin_class
。admin_class
默認爲 ModelAdmin
(默認管理選項)。若是給出關鍵字參數 - 例如list_display
- 它們將做爲選項應用於管理類。
ImproperlyConfigured
若是模型是抽象的,則引起。而且django.contrib.admin.sites.AlreadyRegistered
若是模型已經註冊。
AdminSite
實例掛接到你的URLconf中¶設置Django管理員的最後一步是將您的AdminSite
實例掛接到您的URLconf中。經過在AdminSite.urls
方法中指定給定的URL來完成此操做 。沒有必要使用 include()
。
在這個例子中,咱們在URL處註冊了默認AdminSite
實例 django.contrib.admin.site
/admin/
# urls.py
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
AdminSite
類¶若是您想使用自定義行爲設置本身的管理網站,則能夠自由分類AdminSite
並覆蓋或添加任何您喜歡的內容。而後,簡單地建立一個你的AdminSite
子類的實例(就像你實例化任何其餘Python類同樣),並ModelAdmin
使用它註冊你的模型和 子類,而不是默認的站點。最後,更新myproject/urls.py
以引用您的AdminSite
子類。
從 django.contrib.admin 導入 AdminSite
從 .models 導入 MyModel
class MyAdminSite (AdminSite ):
site_header = 'Monty Python administration'
admin_site = MyAdminSite (name = 'myadmin' )
admin_site 。註冊(MyModel )
從 django.conf.urls 導入 網址
從 myapp.admin 導入 admin_site
urlpatterns的 = [
URL ([R '^ myadmin /' , admin_site 。網址),
]
請注意,您可能不但願admin
在使用本身的AdminSite
實例時自動發現模塊,由於您可能會導入admin
模塊中的全部每一個應用程序 myproject.admin
模塊。這意味着你須要投入'django.contrib.admin.apps.SimpleAdminConfig'
,而不是 'django.contrib.admin'
在你的INSTALLED_APPS
設置。
在同一個Django驅動的網站上建立管理站點的多個實例很容易。只需AdminSite
在不一樣的URL上建立多個實例和root。
在這個例子中,URL /basic-admin/
和/advanced-admin/
管理站點的不同版本具備不一樣的功能 - 分別使用AdminSite
實例 myproject.admin.basic_site
和myproject.admin.advanced_site
:
# urls.py
from django.conf.urls import url
from myproject.admin import basic_site, advanced_site
urlpatterns = [
url(r'^basic-admin/', basic_site.urls),
url(r'^advanced-admin/', advanced_site.urls),
]
AdminSite
實例對它們的構造函數採用一個參數,它們的名稱能夠是任何你喜歡的。此參數成爲URL名稱的前綴,用於反轉它們。這隻在您使用多個應用程序時纔有必要AdminSite
。
就像ModelAdmin
,AdminSite
提供了一個get_urls()
能夠被覆蓋的 方法來定義網站的附加視圖。要向管理網站添加新視圖,請擴展基本 get_urls()
方法以包含新視圖的模式。
注意
request.current_app
在渲染模板以前,您渲染的任何使用管理模板的視圖或者擴展基本管理模板都應該設置。它應該被設置爲,self.name
若是你的觀點是在 AdminSite
或者self.admin_site.name
你的觀點是在一個 ModelAdmin
。
您能夠經過在URLconf中添加幾行來爲管理站點添加密碼重置功能。具體來講,添加這四種模式:
from django.contrib.auth import views as auth_views
url(
r'^admin/password_reset/$',
auth_views.PasswordResetView.as_view(),
name='admin_password_reset',
),
url(
r'^admin/password_reset/done/$',
auth_views.PasswordResetDoneView.as_view(),
name='password_reset_done',
),
url(
r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$',
auth_views.PasswordResetConfirmView.as_view(),
name='password_reset_confirm',
),
url(
r'^reset/done/$',
auth_views.PasswordResetCompleteView.as_view(),
name='password_reset_complete',
),
(這假設你已經添加了管理員admin/
而且要求你^admin/
在包含管理應用程序自己的行以前開始添加URL )。
admin_password_reset
指定URL 的存在會致使「忘記密碼?」連接出如今密碼框的默認管理員登陸頁面上。
LogEntry
對象¶models.
LogEntry
¶
該LogEntry
班跟蹤添加,修改,並經過管理界面作對象的缺失。
LogEntry
屬性¶LogEntry.
action_time
¶
行動的日期和時間。
LogEntry.
user
¶
AUTH_USER_MODEL
執行操做的用戶(實例)。
LogEntry.
content_type
¶
所述ContentType
經修改的對象的。
LogEntry.
object_id
¶
修改對象的主鍵的文本表示。
LogEntry.
object_repr
¶
該object`s repr()
修改後。
LogEntry.
action_flag
¶
操做類型的記錄:ADDITION
,CHANGE
,DELETION
。
例如,要獲取經過管理員完成的全部添加的列表:
from django.contrib.admin.models import LogEntry, ADDITION
LogEntry.objects.filter(action_flag=ADDITION)
LogEntry.
change_message
¶
修改的詳細說明。例如,在編輯的狀況下,該消息包含編輯字段的列表。Django管理站點將此內容格式化爲JSON結構,以便get_change_message()
能夠從新構造 用當前用戶語言翻譯的消息。自定義代碼可能會將其設置爲純字符串。建議您使用該get_change_message()
方法來檢索該值,而不是直接訪問它。
之前,這個屬性老是一個純字符串。它如今是JSON結構,所以能夠用當前用戶語言翻譯消息。舊信息未觸及。
LogEntry
方法¶LogEntry.
get_edited_object
()
¶
返回引用對象的快捷方式。
LogEntry.
get_change_message
()
¶
格式化並翻譯change_message
成當前的用戶語言。在Django 1.10以前建立的消息將始終以它們所記錄的語言顯示。
當AdminSite
被部署,由該網站提供的意見是使用Django的訪問URL倒車系統。
該AdminSite
提供瞭如下命名的URL模式:
頁 | 網址名稱 | 參數 |
---|---|---|
指數 | index |
|
登陸 | login |
|
登出 | logout |
|
密碼更改 | password_change |
|
密碼更改完成 | password_change_done |
|
i18n JavaScript | jsi18n |
|
應用程序索引頁 | app_list |
app_label |
重定向到對象的頁面 | view_on_site |
content_type_id , object_id |
每一個ModelAdmin
實例都提供了一組額外的指定URL:
頁 | 網址名稱 | 參數 |
---|---|---|
更改列表 | {{ app_label }}_{{ model_name }}_changelist |
|
加 | {{ app_label }}_{{ model_name }}_add |
|
歷史 | {{ app_label }}_{{ model_name }}_history |
object_id |
刪除 | {{ app_label }}_{{ model_name }}_delete |
object_id |
更改 | {{ app_label }}_{{ model_name }}_change |
object_id |
在UserAdmin
提供了一個名爲網址:
頁 | 網址名稱 | 參數 |
---|---|---|
密碼更改 | auth_user_password_change |
user_id |
這些命名的URL在應用程序名稱空間中註冊admin
,而且與實例名稱空間相對應,該名稱空間與Site實例的名稱相對應。
所以 - 若是您想要Choice
在默認管理員中獲取特定對象(來自投票應用程序)的Change視圖的引用 ,您能夠調用:
>>> from django.urls import reverse
>>> c = Choice.objects.get(...)
>>> change_url = reverse('admin:polls_choice_change', args=(c.id,))
這將找到管理應用程序的第一個註冊實例(不管實例名稱如何),並poll.Choice
在該實例中解析爲視圖以更改 實例。
若是您想在特定的管理員實例中查找URL,請提供該實例的名稱做爲current_app
反向調用的提示。例如,若是您特別想要來自admin實例的管理視圖,則 custom
須要調用:
>>> change_url = reverse('admin:polls_choice_change', args=(c.id,), current_app='custom')
有關更多詳細信息,請參閱反轉名稱空間URL的文檔。
爲了讓模板中的管理url更容易反轉,Django提供了一個admin_urlname
以action做爲參數的 過濾器:
{% load admin_urls %}
<a href="{% url opts|admin_urlname:'add' %}">Add user</a>
<a href="{% url opts|admin_urlname:'delete' user.pk %}">Delete this user</a>
以上示例中的操做與上述實例的URL名稱的最後一部分相匹配 ModelAdmin
。該opts
變量能夠是其具備的任何對象app_label
和model_name
屬性,一般是由當前模型管理員視圖提供。
staff_member_required
裝飾¶staff_member_required
(
redirect_field_name ='next'
,
login_url ='admin:login'
)
[source]
¶
此裝飾器用於須要受權的管理視圖。用這個函數裝飾的視圖將具備如下行爲:
User.is_staff=True
),而且處於活動狀態(User.is_active=True
),則正常執行該視圖。login_url
參數指定的URL ,其中最初請求的路徑將由查詢字符串變量指定redirect_field_name
。例如: /admin/login/?next=/admin/polls/question/3/
。用法示例:
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def my_view(request):
...原文連接:https://docs.djangoproject.com/en/1.11/ref/contrib/admin/