`
huangyiiiiii
  • 浏览: 117588 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

django newforms admin

阅读更多
又用 django 做了个项目,因为主要都是后台的东西,所以决定启用 django 的 newforms admin 分支!(不过这里我不是推荐大家现在就开始用 newforms admin 分支,如果没有把握,最好是抱着玩玩的态度先,我在开发过程中就改掉它好几个bug)

newforms admin 分支是用 newforms 来重构 admin 模块,也顺便改变了一些设计决策,大大增强了 admin 的可定制性。首先 newforms 的应用,成功分离了 db field、form field、widget 三个部分,db field 属于 ORM ,主要负责 model 相关的事务,form field 主要处理用户输入数据的验证,widget 负责渲染ui,似乎这里面还透着 MVC 的影子呢 ;-)
newforms admin中可以方便地对 widget 进行替换,怎一个爽字了得。
另外,新的 admin 把 admin 部分的定义从 model 中分离出来了,似乎写起来要麻烦点,不过好处也是显而易见的,首先是 model 定义更整洁了,其次新的 admin 设计成了一种重用性更好的形式,用得好的话还能省下不少代码呢,而且能够完成一些以前的 admin 很难完成的任务。
新 admin 的核心在于 AdminSite 和 AdminModel,AdminSite 负责一些全局性的事务,比如首页,用户登录登出改密码权限控制,和model的注册,AdminModel 负责单个 model 的相关管理页面。 这样做的好处是你可以继承这两个类,覆盖掉一些合适的方法,你基本上可以为所欲为。
比如,我在这个项目中就写了这么几个自定义的 admin 类:

class CustomAdmin(admin.ModelAdmin):
def before_save(self, request, instance, form, change=False):
pass

def save_add(self, request, model, form, post_url_continue):
def custom_save(form, commit=False):
instance = model()
new_object = forms.save_instance(form, instance,
fail_message='created', commit=False)
self.before_save(request, new_object, form)
if commit:
new_object.save()
for f in model._meta.many_to_many:
if f.name in form.cleaned_data:
setattr(new_object, f.attname, form.cleaned_data[f.name])
return new_object
form.__class__.save = custom_save
return super(CustomAdmin, self).save_add(request, model, form,
post_url_continue)

def save_change(self, request, model, form):
def custom_save(form, commit=False):
from copy import copy
new_object = forms.save_instance(form,
copy(form.original_object),
fail_message='changed', commit=False)
self.before_save(request, new_object, form, change=True)
if commit:
new_object.save()
for f in model._meta.many_to_many:
if f.name in form.cleaned_data:
setattr(new_object, f.attname, form.cleaned_data[f.name])
return new_object
form.__class__.save = custom_save
return super(CustomAdmin, self).save_change(request, model, form)

大家应该可以看得出来,这个 admin 提供了 before_save 的钩子(当然你也可以提供 after)save 不过我这里暂时只需要 before_save),你可以继承它然后在这个方法里写些代码,就得在 model 保存之前得到执行。你可能要问,为什么不直接定义 Model 的 save 方法呢?答案很简单 Model 不知道 request 和 form 的存在!
在 before_save 中你就可以做些很有意思的事情了,比如自动把 model 中某个字段设置成当前登录用户!这个定制需求其实很早就提出来了,以前的解决方案是写个 middleware 把 request 放到 threadlocal 中去,然后在 model 中通过 threadlocal 获取当前请求的 request ,能用,但是很麻烦也很丑。现在用这个 before_save 可以轻松实现:
class AutoUserAdmin(CustomAdmin):
user_field_name = 'postuser'
def before_save(self, request, instance, form, change=False):
setattr(instance, self.user_field_name, request.user)
super(AutoUserAdmin, self).before_save(request, instance, form, change)

当然你也可以继承这个 AutoUserAdmin ,写上你自己的 user_field_name ,太简单了。
还有一个常见的定制需求就是限制登录用户只能看到自己发布的信息,看不到更不能修改别人发布的信息。 在上面这个 AutoUserAdmin 的基础上做:
class RestrictUserAdmin(AutoUserAdmin):
def queryset(self, request):
queries = {self.user_field_name:request.user}
return super(RestrictUserAdmin, self).queryset(request).\
filter(**queries)

是不是超简单?呵呵。
另外别忘了 python 还支持传说中的多重继承,意味着你可以同时继承多个 admin 类,并拥有多个 admin 类的组合功能。比如我这里定制了一个支持文件上传的 admin(newforms 和 newforms admin 暂时都还没有把文件上传相关的东西加进去,只能自己写),我把它叫做 FileUploadAdmin ,现在我希望我的 admin 能同时拥有 RestrictUserAdmin 和 FileUploadAdmin 的功能,没问题:
class CommonAdmin(FileUploadAdmin, AutoUserAdmin):
date_hierarchy = 'pubdate'
list_per_page = 15
ordering = ('-id',)

当然我还在里面定义了一些通用的(当然是对于我自己的项目来说) admin 配置。
然后怎么把这些 admin 应用到 model 上去呢?
class ProductAdmin(CommonAdmin):
list_display = ('__str__', 'type', 'unitname', 'unitprice',
'qsinfo', 'postuser', 'pubdate', 'image_view')
list_filter = ('type', 'pubdate')
)
admin.site.register(Product, ProductAdmin)

上面的代码虽然不错,不过我还是嫌麻烦,实际上我是这么写的:
admin.site.register(Product,
CommonAdmin,
list_display = ('__str__', 'type', 'unitname', 'unitprice',
'qsinfo', 'postuser', 'pubdate', 'image_view'),
list_filter = ('type', 'pubdate'),
section_name = '通用',
)

不过要让上面的代码正常运行,还需要对 django newforms admin 分支的代码做一点小改动即可,在文件 django/contrib/admin/sites.py 中大约 73 行的位置,
          # TODO: Handle options

的下面加上:
          # it works
if options:
admin_class = type(admin_class.__name__, (admin_class,),
options)

实际上,使用 django 乃至 python 最大的快乐就是别人写的代码你都可以轻松看懂,这难道不是作为程序员最大的快乐吗? ;-)

如果你现在开始用 django newforms admin 分支的话,估计遇到的大部分问题都是和 unicode 有关(因为我遇到的就是这样的),这是因为目前 django 的开发 和 python 本身的开发一样,都处在整体向 unicode 迁移的过程之中,当前最大的矛盾就是 ORM 使用的是普通字符串(也就是 python3000中所谓字节数组),而 newforms 却开始整体使用 unicode 了,这常常带来麻烦。如果你在基于 django 最新的 svn 版本开发,那一定要看一下 Unicode 分支了,里面说到了如何使让你的程序顺利过渡到 unicode ,祝大家过渡快乐 ;-)
分享到:
评论

相关推荐

    django-admin-bootstrap-master.zip

    【django-admin-bootstrap-master.zip】是一个包含Django管理界面(admin)风格化为Bootstrap主题的项目压缩包。这个项目旨在提供一个美观、响应式且用户体验友好的Django后台管理界面。Bootstrap是一个流行的前端...

    基于python+Django的admin后台管理系统.zip

    通过深入学习和理解这个毕设项目,学生不仅可以提升Python和Django的实战技能,还能了解到如何组织和管理Web项目的文件结构,以及如何利用Django的admin后台进行高效的数据管理。这将为未来的职业生涯打下坚实的基础...

    djangoadminenvnotice在DjangoAdmin中可视化辨别environments

    "django-admin-env-notice" 是一个Django应用,它的主要目的是帮助开发者在Django Admin界面中直观地识别当前运行的环境,从而避免在不同环境中误操作。 首先,我们来了解什么是Django Admin。Django Admin是Django...

    django-admin-bootstrapped-1.6.2.zip_bootstrap_django_django admi

    **Django Admin Bootstrapped** 是一个专门为Django框架设计的第三方应用,它提供了一个基于Twitter Bootstrap的美化版Django管理界面(admin site)。Bootstrap是一个流行的前端开发框架,用于构建响应式、移动优先...

    Python-djangoadmin美化采用layui作为基本框架改写大部分页面

    "Python-djangoadmin美化采用layui作为基本框架改写大部分页面"这个项目旨在提升Django内置的admin界面的用户体验,通过引入layui这一现代前端框架,对默认的admin模板进行了全面的改造。 layui是一款优秀的前端UI...

    django-admin-colors:可自定义的Django管理员颜色主题

    pip install django-admin-colors 配置中 以下说明是使django-admin-colors正常工作所必需的。 配置您的settings.py INSTALLED_APPS = [ ..., 'admincolors' ] # Choose a base theme # If empty or not set, ...

    django-admin-tools:扩展Django Admin以包括可扩展的仪表板和导航菜单

    django-admin-tools django-admin-tools是默认django管理界面的扩展/工具的集合,它包括: 功能齐全且可自定义的仪表板; 可自定义的菜单栏; 简化管理员主题设置的工具。 该代码托管在。 Django-admin-tools有大量...

    Python库 | django-admin-sso-0.1.1.tar.gz

    《Python库深度剖析:django-admin-sso-0.1.1》 在IT行业中,Python以其简洁、易读的语法和强大的库支持成为了后端开发的热门选择。Django,作为Python的一个优秀Web框架,更是备受开发者青睐。本文将深入探讨一个...

    PyPI 官网下载 | django-admin-rangefilter-0.3.3.tar.gz

    **PyPI 官网下载 | django-admin-rangefilter-0.3.3.tar.gz** 在Python的世界里,PyPI(Python Package Index)是官方的第三方软件包仓库,它为开发者提供了一个平台来发布和分享他们的Python库。`django-admin-...

    Python库 | django_admin_index-1.0.0.tar.gz

    **Python库 django_admin_index-1.0.0.tar.gz** `django_admin_index` 是一个针对Python的Django框架开发的库,主要用于改进默认的管理界面(admin interface)。Django是用Python编写的一个高级Web框架,它鼓励...

    django-admin-list-filter-dropdown:在Django管理员列表过滤器中使用下拉菜单

    django-admin-list-filter-dropdown 呈现为下拉列表的Django管理过滤器实现。 如果要在Django admin中过滤的字段具有十个以上的值,则过滤侧边栏会变得很长,混乱且难以使用。 此应用程序包含DropdownFilter类,该类...

    PyPI 官网下载 | django-admin-tailwind-0.0.13.tar.gz

    **PyPI 官网下载 | django-admin-tailwind-0.0.13.tar.gz** 在Python的世界里,PyPI(Python Package Index)是官方的第三方软件包仓库,它为Python开发者提供了一个集中化的地方来发布、搜索和下载各种Python模块...

    PyPI 官网下载 | django-admin-charts-0.13.0.tar.gz

    **PyPI官网与Django-admin-charts库** `PyPI`(Python Package Index)是Python社区的官方软件仓库,提供了一个平台,使得Python开发者能够发布、分享和安装各种开源项目。`PyPI`包含了众多的Python库和工具,极大...

    django-admin-dialog:显示一个对话框弹出窗口,其中包含您指示的管理字段的帮助文本

    django-admin-dialog 显示一个对话框弹出窗口,其中包含针对您所指定的管理字段的帮助文本。 要求 django-redactoreditor 安装 通过pip安装应用程序: $ pip install django-admin-dialog 将django_admin_dialog...

    PyPI 官网下载 | django-admin-charts-0.15.0.tar.gz

    **PyPI 官网下载 | django-admin-charts-0.15.0.tar.gz** `django-admin-charts-0.15.0.tar.gz` 是一个在Python Package Index(PyPI)官网上发布的软件包,它属于Python生态系统中的一个库。PyPI是Python开发者...

    PyPI 官网下载 | django_admin_kit-0.0.12-py3-none-any.whl

    **标题解析:** "PyPI 官网下载 | django_admin_kit-0.0.12-py3-none-any.whl" 这个标题表明这是一个从Python Package Index(PyPI)官方源下载的软件包,名为`django_admin_kit`,版本号为0.0.12,适用于Python 3...

    Python库 | django-admin-sortable-2.1.13.tar.gz

    **Python库 django-admin-sortable-2.1.13** `django-admin-sortable-2.1.13.tar.gz` 是一个针对Python编程语言和Django框架的后端开发库,用于增强Django管理界面(admin site)的功能,特别是增加了模型实例排序...

    基于Django的Admin后台管理主题设计源码

    该项目是一个django admin的主题,基于element-ui和vue开发,重写和优化了90%以上的页面,使django admin更符合国人的使用习惯。并且实现了不用修改任何代码为django admin换肤,100%兼容原生admin。

    django-admin-interface:django的默认管理界面可自定义。 弹出窗口被模态代替

    django-admin-interface django-admin-interface是一个现代的响应式平面管理界面,可以由admin本身进行自定义。 产品特点 美丽的默认Django主题 主题管理和自定义(您可以自定义管理员标题,徽标和颜色) React...

    PyPI 官网下载 | django-admin-interface-0.16.3.tar.gz

    标题中的"PyPI 官网下载 | django-admin-interface-0.16.3.tar.gz"表明我们正在讨论的是一个在Python Package Index (PyPI)上发布的开源项目,具体是`django-admin-interface`的版本0.16.3。这个项目通常是一个...

Global site tag (gtag.js) - Google Analytics