添加自定义动作:

例子,添加一个方法,批量更新文章,代码如下:

from django.contrib import admin
from myapp.models import Article def make_published(self, request, queryset):
rows_updated = queryset.update(status=’p’)
if rows_updated == 1:
message_bit = "1 story was"
else:
message_bit = "%s stories were" % rows_updated
self.message_user(request, "%s successfully marked as published." % message_bit) class ArticleAdmin(admin.ModelAdmin):
list_display = [’title’, ’status’]
ordering = [’title’]
actions = [make_published] admin.site.register(Article, ArticleAdmin)

  

效果如下:

自定义动作的权限控制,重载get_actions方法,如下:(只允许名字以J大头的删除记录)

from django.contrib import admin
from myapp.models import Article def make_published(self, request, queryset):
rows_updated = queryset.update(status=’p’)
if rows_updated == 1:
message_bit = "1 story was"
else:
message_bit = "%s stories were" % rows_updated
self.message_user(request, "%s successfully marked as published." % message_bit) class ArticleAdmin(admin.ModelAdmin):
list_display = [’title’, ’status’]
ordering = [’title’]
actions = [make_published] def get_actions(self, request):
actions = super(MyModelAdmin, self).get_actions(request)
if request.user.username[0].upper() != ’J’:
if ’delete_selected’ in actions:
del actions[’delete_selected’]
return actions

是不是一定要在admin.py中实现ModelAdmin的子类呢?

不一定,如果你觉得默认的ok,那么可以这样注册你的model,

admin.site.register(YourModel)

  

ModelAdmin api详解:

django (648~?)

ModelAdmin.save_model

原始实现

如下(仅仅保存模型实例)C:\Python27\Lib\site-packages\django\contrib\admin\options.py 856~860行

    def save_model(self, request, obj, form, change):
"""
Given a model instance save it to the database.
"""
obj.save()

参数说明:

request - HttpRequest

obj - model.Models的子类的实例

form - ModelForm的实例

change - 布尔类型,标识是修改还是新增obj。

应用:

在obj.save之前或者之后做一些操作。

ModelAdmin.delete_model

原始实现

如下(仅仅删除模型实例)C:\Python27\Lib\site-packages\django\contrib\admin\options.py 862~866行

    def delete_model(self, request, obj):
"""
Given a model instance delete it from the database.
"""
obj.delete()

  

参数说明:

request - HttpRequest

obj - model.Models的子类的实例

应用:

在obj.delete()之前或者之后做一些操作。

ModelAdmin.save_formset

原始实现

如下(仅仅保存formset)C:\Python27\Lib\site-packages\django\contrib\admin\options.py 868~872行

    def save_formset(self, request, form, formset, change):
"""
Given an inline formset save it to the database.
"""
formset.save()

  

参数说明:

request - HttpRequest

form - ModelForm的实例

formset - ModelFormSet的实例

change - 布尔类型,标识是修改还是新增obj。

应用:

在formset.save之前或者之后做一些操作。

例子:

保存之前记录操作用户

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

ModelAdmin.get_ordering

原始实现

如下(仅仅保存formset)C:\Python27\Lib\site-packages\django\contrib\admin\options.py 251~255行

    def get_ordering(self, request):
"""
Hook for specifying field ordering.
"""
return self.ordering or () # otherwise we might try to *None, which is bad ;)

参数说明:

request - HttpRequest

返回值:类似ordering属性的元组或者列表

应用:

动态排序,可根据request里面的变量进行动态排序。

ModelAdmin.get_search_results(request,queryset,search_term)

原始实现

    def get_search_results(self, request, queryset, search_term):
"""
Returns a tuple containing a queryset to implement the search,
and a boolean indicating if the results may contain duplicates.
"""
# Apply keyword searches.
def construct_search(field_name):
if field_name.startswith('^'):
return "%s__istartswith" % field_name[1:]
elif field_name.startswith('='):
return "%s__iexact" % field_name[1:]
elif field_name.startswith('@'):
return "%s__search" % field_name[1:]
else:
return "%s__icontains" % field_name use_distinct = False
if self.search_fields and search_term:
orm_lookups = [construct_search(str(search_field))
for search_field in self.search_fields]
for bit in search_term.split():
or_queries = [models.Q(**{orm_lookup: bit})
for orm_lookup in orm_lookups]
queryset = queryset.filter(reduce(operator.or_, or_queries))
if not use_distinct:
for search_spec in orm_lookups:
if lookup_needs_distinct(self.opts, search_spec):
use_distinct = True
break return queryset, use_distinct

  

参数说明:

request - HttpRequest

queryset - queryset

search_term - 字符串,以空格隔开

返回值:(queryset,is_distinct)

应用:

重载以实现个性化搜索。

例子:

实现整型数据的搜索支持

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,
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

  

django admin 扩展的更多相关文章

  1. django admin扩展user表password验证及set_password

    一般如果扩展了django user内置表,在admin后台创建新用户的时候密码将会变成明文,故而导致登录不成功.所以我们在admin.py可以通过form自定义进行对password进行操作,可以双 ...

  2. Django admin 组件 原理分析与扩展使用 之 sites.py (一)

    一 . 前言 Django 提供了admin 组件 为项目提供基本的管理后台功能(对数据表的增删改查). 本篇文章通过 admin源码 简单分析admin 内部原理 ,扩展使用方式,为以后进行定制和自 ...

  3. Django admin美化插件suit应用[原创]

    前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...

  4. Django admin 权威指南(一)

    版本: Django 1.10 此部分由官方文档<6.5.1 The Django admin site>翻译而来. 6.5.1.1 概览 默认情况下,使用startproject的时候, ...

  5. Django admin究竟要怎么写才优雅

    比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...

  6. Django admin注册model究竟要怎么写才优雅 批量注册model

    比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...

  7. Django的认证系统和Django admin的简单使用

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  8. Django admin注册model究竟要怎么写才优雅

    比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...

  9. 利用 Django admin 完成更多任务(转)

    利用 Django admin 完成更多任务   Django admin Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处.虽然 ...

随机推荐

  1. 第十六章:脚本化HTTP

    写在本章内容前: 第十五章:事件处理 涉及到到较多的文字篇幅,介于个人精力问题,暂不更新.主要包含的内容有事件类型.注册事件处理程序.事件处理程序的调用.文档加载事件.鼠标事件.鼠标滚轮事件.拖放事件 ...

  2. RESTful WebService入门(转)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lavasoft.blog.51cto.com/62575/229206 REST ...

  3. 用form表单实现Ajax---post提交

    实例讲解:新闻发布实现无刷新上传,显示 html代码: 注意:文本框中并没有id  ,,只有name.jquery获取每个文本框的值还要在拼写提交格式(id=value&name=value& ...

  4. baidu时光轴_使用window.scroll实现的

    <!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...

  5. Eclipse-将svn上的项目转化成相应的项目

    这里假设svn上的项目为maven项目 首先从svn检出项目 其中项目名称code可自己定义更改新的名称 从svn检出的项目结构 然后将项目转化成相关的项目 转换加载中 加载/下载 maven相关内容 ...

  6. 【心得&&体会】

    ★2016.1.1★ 很早就想写这样的一篇blog了,但一直没有抽空去实现,新的一年感觉应该有所改变,故深夜提笔(码字) NOIP卡掉和连续两次月考爆炸,这段时间确实心理不舒服,调节的也不是很到位,但 ...

  7. jstl是自动就有的吗,不是的Unknown tag (c:if).

    这个错误的原因就是没有导包 http://www.runoob.com/jsp/jsp-jstl.html 这个网站有方法

  8. 【转】set容器的基本操作

    set的基本操作:begin()         返回指向第一个元素的迭代器clear()         清除所有元素count()         返回某个值元素的个数empty()        ...

  9. Vijos1889 天真的因数分解

    描述 小岛: 什么叫做因数分解呢?doc : 就是将给定的正整数n, 分解为若干个素数连乘的形式.小岛: 那比如说 n=12 呢?doc : 那么就是 12 = 2 X 2 X 3 呀.小岛: 呜呜, ...

  10. GNUPLOT画图工具

    http://blog.csdn.net/codingkid/article/details/7211492 不得不说这个工具实在是太强大了. 1.首先命令简单,不会有那么多的语法问题. 2.其次画图 ...