the5fire的技术博客

关注python、vim、linux、web开发和互联网--life is short, we need python.


手把手教你用xadmin替换django自带的admin模块 13754°C

作者:the5fire | 标签:       | 发布:2014-06-01 8:37 p.m.

上一篇文章 django博客的后台重新换到xadmin 概括的说了下我在blog后台对xadmin的使用情况,附了一张图让大家感受下。这篇文章主要从代码的角度来介绍下,如果想把已有的admin后台转为xadmin,需要做哪些工作。

目前xadmin的版本为0.5.0

install xadmin

首先当然是安装xadmin了,通过命令: pip install django-xadmin 。安装完之后,需要在项目的settings中也把它加入到 INSTALL_APPS 中, 它还依赖另外两个组件:django-crispy-forms和django-reversion,前者是必装的(安装xadmin时会自动安装),后者是可选的。install_app中的代码如下:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',  # 这个可以去掉
    'django_xmlrpc',

    'xadmin',
    'crispy_forms',
    # 'reversion',  #  需要pip install django-reversion
    'pingback',
    'duoshuo',

    'blog',
    'weixin',
)

django的admin可以去掉了。

配置xadmin

上面是安装,这里是配置,和admin的配置一样,只需要在urls.py里添加:

import xadmin
xadmin.autodiscover()

这里有个注意事项,你需要把admin的配置去掉,这俩admin可能存在冲突,会导致出错。不知道现在修复没有。不过这不重要了,有了xadmin,自带的admin就没有用武之地了。

第二项配置就是url的配置,这时的注意事项是,你要去掉admin的url,加入xadmin的url,这意味着 你在项目其他地方使用到的admin url的reverse代码需要修改,另外xadmin的更新和admin的更新url不同 这点也是很多人替换之后项目出现 admin namespace 不存在bug的原因。

url配置如下:

urlpatterns = patterns('',
    url(r'^$', IndexView.as_view(), name='home'),

    url(r'^xadmin/', include(xadmin.site.urls), name='xadmin'),

    #...
)

开始替换admin吧

如果你只是对admin进行了简单的配置, 你需要做的就是替换到自定义Admin的继承为 object ,替换admin.site.register为xadmin.site.register。一个简单的示例:

#coding:utf-8
from django.contrib import admin
from django.core import urlresolvers

from .models import Post


class PostAdmin(admin.ModelAdmin):
#class PostAdmin(object):   #  一处替换
    search_fields = ('title', 'alias')
    fields = ('content', 'summary', 'title', 'alias', 'tags', 'status',
            'category', 'is_top', 'is_old', 'pub_time')
    list_display = ('preview', 'title', 'category', 'is_top', 'pub_time')
    ordering = ('-pub_time', )
    save_on_top = True

    def preview(self, obj):
                                        #  第二处替换: 'xadmin:blog_post_change'
        url_edit = urlresolvers.reverse('admin:blog_post_change', args=(obj.id,))
        return u'''
                    <span><a href="/%s.html" target="_blank">预览</a></span>
                    <span><a href="%s" target="_blank">编辑</a></span>
                ''' % (obj.alias, url_edit)

    preview.short_description = u'操作'
    preview.allow_tags = True

admin.site.register(Post, PostAdmin)
#  第三处替换
# xadmin.site.register(Post, PostAdmin)

上面的代码,看起来定义了很多东西,其实只需要做三处替换就行。当然, 记得把admin.py更改为adminx.py

上面说了的如果你只是简单的配置,但是如果你自定义了一些方法的话怎么做呢?比如我自己的blog,我后台编辑的是restructure格式的文本,在保存时会转成html存到数据。具体代码如下,我重写了django admin的 save_model 方法:

#coding:utf-8
from django.contrib import admin
from django.core import urlresolvers

from .models import Post


class PostAdmin(admin.ModelAdmin):
#class PostAdmin(object):   #  一处替换
    # 省略上面代码

    def save_model(self, request, obj, form, change):
    #def save_models(self):   # 注意这里
        #obj = self.new_obj
        #request = self.request
        obj.author = request.user
        if not obj.summary:
            obj.summary = obj.content
        if not obj.is_old:
            obj.content_html = restructuredtext(obj.content)
        else:
            obj.content_html = obj.content.replace('\r\n', '<br/>')
            import re
            obj.content_html = re.sub(r"\[cc lang='\w+?'\]", '<pre>', obj.content_html)
            obj.content_html = obj.content_html.replace('[/cc]', '</pre>')
        obj.save()

因为xadmin虽然在属性上兼容了admin,但提供的接口和之前的admin并不一致,因此如果你有用到类似的方法你需要自行修改。那么你怎么能知道需要修改成那种接口呢(为什么save_model得修改成save_models)。这个就得去看代码了,文档现在还是很少。

因为xadmin的自定义Admin类都是继承自object,导致很多人不知道该如何去看xadmin的ModelAdmin到底提供了哪些接口。这里提供一个关键的线索,xadmin的ModelAdmin设计和Django的ClassBase View类似。它的List部分的管理,Edit部分的管理,还有其他的都在代码/xadmin/views/下面分别是list.py,edit.py,还有detail.py等模块

所提供的接口通过重写可以满足大多数的需求。

总结

关于xadmin怎么替换django自带的admin,也就这些内容了,关键点就是属性上完全兼容,方法上得去看源代码。不过就算是你用Django自带的admin,也一样得去看源码,文档挺少。如果有真的打算对后台定制的需求的话,应该记住一句话, 代码就是最好的文档


----EOF-----

扫码关注,或者搜索微信公众号:the5fire

其他分类: