Djangoadminsite(二)ModelAdminmethods

來源:互聯網
上載者:User

ModelAdmin methods

save_model(request, obj, form, change)

此方法為admin介面使用者儲存model執行個體時的行為。request為HttPRequest執行個體,obj為model執行個體,form為ModelForm執行個體,change為bool值,取決於model執行個體是新增的還是修改的。

重寫此方法可以做一些pre-save或者post-save行為。

比如,可以把request.user儲存為model執行個體的屬性:

from django.contrib import admin

class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.user = request.user
obj.save()

delete_model(request, obj)

admin介面使用者刪除model執行個體時的方法。

save_formset(request, form, formset, change)

admin介面使用者儲存formset的方法,可以改寫:

class ArticleAdmin(admin.ModelAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
instance.user = request.user
instance.save()
formset.save_m2m()

get_ordering(request)

排序。

class PersonAdmin(admin.ModelAdmin):

def get_ordering(self, request):
if request.user.is_superuser:
return ['name', 'rank']
else:
return ['name']

get_search_results(request, queryset, search_term)

可以定製查詢結果。

save_related(request, form, formsets, change)

formsets是model的inline formsets的列表。model的相關對象儲存時的行為。

def save_related(self, request, form, formsets, change):
"""
Given the ``HttpRequest``, the parent ``ModelForm`` instance, the
list of inline formsets and a boolean value based on whether the
parent is being added or changed, save the related objects to the
database. Note that at this point save_form() and save_model() have
already been called.
"""
form.save_m2m()
for formset in formsets:
self.save_formset(request, form, formset, change=change)

get_readonly_fields(request, obj=None)

返回唯讀欄位。

get_prepopulated_fields(request, obj=None)

返回預置欄位。

get_list_display(request)

返回list_display。

get_list_display_links(request, list_display)

返回list_display_link。

get_fields(request, obj=None)
返回fields。

get_fieldsets(request, obj=None)
返回fieldsets。

get_list_filter(request)
返回list_filter。

get_search_fields(request)
返回search_fields。

get_inline_instances(request, obj=None)
返回InlineModelAdmin對象的列表或元組

class MyModelAdmin(admin.ModelAdmin):
def get_inline_instances(self, request, obj=None):
return [inline(self.model, self.admin_site) for inline in self.inlines]

get_urls()
返回ModelAdmin的可用urls。

class MyModelAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super(MyModelAdmin, self).get_urls()
my_urls = patterns('',
(r'^my_view/$', self.my_view)
)
return my_urls + urls

def my_view(self, request):
# custom view which should return an HttpResponse
pass

上面my_view方法的路徑就是 /admin/myapp/mymodel/my_view/ 。

不過上面的例子中無驗證和緩衝,要提供驗證和緩衝:

class MyModelAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super(MyModelAdmin, self).get_urls()
my_urls = patterns('',
(r'^my_view/$', self.admin_site.admin_view(self.my_view))
)
return my_urls + urls

如果頁面可緩衝而還是要進行許可權驗證:

(r'^my_view/$', self.admin_site.admin_view(self.my_view, cacheable=True))

get_form(request, obj=None, **kwargs)

返回add和change view使用的ModelForm。下面使用者非superuser時會隱藏一些欄位。

class MyModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
self.exclude = []
if not request.user.is_superuser:
self.exclude.append('field_to_hide')
return super(MyModelAdmin, self).get_form(request, obj, **kwargs)

get_formsets(request, obj=None)

Yields InlineModelAdmins for use in admin add and change views.

如果只想在the change view中展示一個特殊的inline:

class MyModelAdmin(admin.ModelAdmin):
inlines = [MyInline, SomeOtherInline]

def get_formsets(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)

get_formsets_with_inlines(request, obj=None)

Yields (FormSet, InlineModelAdmin) pairs for use in admin add and change views.

如果只想在the change view中展示一個特殊的inline:

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

formfield_for_foreignkey(db_field, request, **kwargs)
Foreignkey欄位使用的預設formfield. 根據不同的使用者返回不同的子集:

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)

formfield_for_manytomany(db_field, request, **kwargs)

類似於formfield_for_foreignkey,這個方法用於many to many欄位.:

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,這個方法用於choices:

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)

ModelAdmin.get_changelist(request, **kwargs)
返回changelist頁面使用的Changelis類. 預設django.contrib.admin.views.main.ChangeList。

ModelAdmin.get_changelist_form(request, **kwargs)
返回changelist頁面使用的ModelForm類。

from django import forms

class MyForm(forms.ModelForm):
pass

class MyModelAdmin(admin.ModelAdmin):
def get_changelist_form(self, request, **kwargs):
return MyForm

ModelAdmin.get_changelist_formset(request, **kwargs)
返回changelist頁面使用的ModelFormSet類。

from django.forms.models 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.has_add_permission(request)
是否具有add許可權。

ModelAdmin.has_change_permission(request, obj=None)
是否具有change許可權。

ModelAdmin.has_delete_permission(request, obj=None)
是否具有delete許可權。

ModelAdmin.get_queryset(request)
返回admin介面可編輯的model QuerySet集。 根據不同的user返回不同的結果:

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)
向使用django.contrib.messages backend的使用者發送資訊。

ModelAdmin.get_paginator(queryset, per_page, orphans=0, allow_empty_first_page=True)
返回一個分頁執行個體。Returns an instance of the paginator to use for this view. By default, instantiates an instance of paginator.

ModelAdmin.response_add(request, obj, post_url_continue=None)
決定add_view()的HttpResponse,model被建立後運行。

ModelAdmin.response_change(request, obj)
決定change_view()的HttpResponse,model被修改後運行。

ModelAdmin.response_delete(request, obj_display)
決定delete_view()的HttpResponse,model被刪除後運行。

obj_display是被刪除對象的name。

ModelAdmin.get_changeform_initial_data(request)
A hook for the initial data on admin change forms. By default, fields are given initial values from GET parameters. For instance, ?name=initial_value will set the name field’s initial value to be initial_value.

This method should return a dictionary in the form {'fieldname': 'fieldval'}:

def get_changeform_initial_data(self, request):
return {'name': 'custom_initial_value'}

Other methods

ModelAdmin.add_view(request, form_url='', extra_context=None)
Django view for the model instance addition page. See note below.

ModelAdmin.change_view(request, object_id, form_url='', extra_context=None)
Django view for the model instance edition page. See note below.

ModelAdmin.changelist_view(request, extra_context=None)
Django view for the model instances change list/actions page. See note below.

ModelAdmin.delete_view(request, object_id, extra_context=None)
Django view for the model instance(s) deletion confirmation page. See note below.

ModelAdmin.history_view(request, object_id, extra_context=None)
Django view for the page that shows the modification history for a given model instance.

這5個方法是被實際的設定為django的view方法的。可以重構,一般是添加渲染view使用的模板的context data:

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)

ModelAdmin asset definitions

為ModelAdmin的 add/change views添加js和CSS:

class ArticleAdmin(admin.ModelAdmin):
class Media:
css = {
"all": ("my_styles.css",)
}
js = ("my_code.js",)

Adding custom validation to the admin

定製form:

class MyArticleAdminForm(forms.ModelForm):
def clean_name(self):
# do something that validates your data
return self.cleaned_data["name"]
class ArticleAdmin(admin.ModelAdmin):
form = MyArticleAdminForm

以上就是Djangoadminsite(二)ModelAdminmethods的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.