Django是一个功能很强大的web框架,因为发展的很快,所以相近的版本间很多函数不同是很正常的事情。这是好事,但是给Django的第三方开发者带来了很大的负担,需要同步更新自己的代码,这确实是很麻烦…不管怎么样,现在如果想在Django 1.8 环境上部署git上的原版xadmin 还是要修改不少地方的,也可以尝试安装1.8的branch,不过可能也会有问题。下面就Django 1.8 版本下部署xadmin做了一些说明。 部署的大致步骤是:
1,pip install django-xadmin 安装 2,修改install_app中的代码如下: 1
2
3
4
5
6
7
8
9
10
11
12
INSTALLED_APPS = (
'django.contrib.auth' ,
'django.contrib.contenttypes' ,
'django.contrib.sessions' ,
'django.contrib.sites' ,
'django.contrib.messages' ,
'django.contrib.staticfiles' ,
'xadmin' ,
'crispy_forms' ,
)
3,在urls.py里添加: 1
2
import xadmin
xadmin.autodiscover()
这里有个注意事项,你需要把admin的配置去掉,这俩admin可能存在冲突,会导致出错。
4,修改urlpatterns配置如下: 1
2
3
4
urlpatterns = patterns('' ,
url(r'^xadmin/' , include(xadmin.site.urls), name='xadmin' ),
)
5,如果对admin进行了简单的配置, 你需要做的就是替换到自定义Admin的继承为 object ,替换admin.site.register为xadmin.site.register。 可以参考https://github.com/sshwsfc/django-xadmin/blob/master/demo_app/app/adminx.py 一个简单的示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from django.contrib import admin
from django.core import urlresolvers
from .models import Post
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) :
url_edit = urlresolvers.reverse('xadmin: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
xadmin.site.register(Post, PostAdmin)
这样走下来就是部署完了,如果是旧版的Django(低于1.6吧)应该可以访问xadmin了,但是如果是1.7版本或以后的可能还有别的问题,下面是需要做的修改, 首先是改下版本的范围1
2
3
4
5
xadmin/models.py
if 4 < django.VERSION[1 ] < 7 :
AUTH_USER_MODEL = django.contrib.auth.get_user_model()
else :
AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL' , 'auth.User' )
否则启动不了 改了可以启动了,但是就会开始各种报错,原因是很多原先用的Django组件都过时了,需要逐一处理,如果用sed批量替换需把条件设置严格一点,以免误换了不想关的地方又麻烦1
2
from django.db.models.related import RelatedObject
from django.db.models.fields.related import ForeignObjectRel
文件中用到RelatedObject 都要改成ForeignObjectRel,下面transaction的commit_on_success也过时了,改成atomic1
2
@transaction.commit_on_success
@transaction.atomic
formtools 和django-contrib-comments安装 将https://github.com/django/django-formtools 这里的formtools文件夹拷贝到/usr/local/python2.7.3/lib/python2.7/site-packages/Django-1.8.3-py2.7.egg/django/contrib/(也就是contrib的目录下)即可1
2
3
4
pip install django-contrib-comments
and use latest code
from django.contrib.comments.models import Comment
from django_comments.models import Comment
opts的module_name属性也过时了,需要修改 ‘Options’ object has no attribute ‘module_name’ 改成model_name 如果更改了代码,错误没有变化,需要重启一下服务器(我的是部署在Nginx+uwsgi上,所以就是重启Nginx+uwsgi,可以写成脚本,每次重启直接执行一下,1s就ok),终于可以看到登陆界面了(可能还有别的问题,可以参考上面的办法解决) 登陆的时候由于要检查cookie,这里又会报错,需要把相关的test注释掉
此外get_query_set在django 1.8中做了如下改动1
2
3
4
5
6
Rename "get_query_set" for "get_queryset"
isinstance(field, models.fields.related.ForeignObjectRel) and
/usr/local/python2.7 .3 /lib/python2.7 /site-packages/xadmin/views/list.py in get_context, line 375
self.get_model_method_fields()改成
tuple(self.get_model_method_fields()))
此外可能还有个别的问题,也是上面的那几类问题了,我的网站简单,当这些都解决后,xadmin界面就出来了。 补充问题:1
2
3
Remove widget.is_hidden=True for Django 1.7
/usr/local/python2.7 .3 /lib/python2.7 /site-packages/xadmin/plugins/quickform.py 中的