在前文中(Django如何打造自定义后台和美化后台管理),我们选择了django-jet来构建美化的admin管理界面,并且期望添加一系列自定义内容和摆件。但是我们成功以v0.08打开后台后又出现一些问题,比如bookmark失效,文档中的设定不适用于老版本等问题,于是要想新的办法。本文用django-suit来达到美化的目的。
在前文中(Django如何打造自定义后台和美化后台管理),我们选择了django-jet来构建美化的admin管理界面,并且期望添加一系列自定义内容和摆件。但是我们成功以v0.08打开后台后又出现一些问题,比如bookmark失效,文档中的设定不适用于老版本等问题,于是要想新的办法。本文用django-suit来达到美化的目的。
django-suit(django-suit(http://django-suit.readthedocs.io)的安装和配置与文档上基本一致,使用非常方便。安装完成后只需要两步,INSTALLED_APPS 里面按照顺序加上’suit’,’django.contrib.admin’,两项。然后同步静态文件即可。这里不再详细赘述。
下一步,因为我们期望在后台操作一些模型的数据,根据需求,除了基本的增删改查,还需要导入导出功能。一般数据导入导出只要是通过csv, xls, json, txt等格式批量导入导出。有两个应用场景,第一是在前台,普通的提交文件,上传文件,然后读取,写入数据库。第二种就是后台管理界面的导入导出。前者我们已经做过很多次了,主要是后者。这里我们经过多次探索最终找到一个叫好的插件。
我们的要求:第一,不能更改太多配置,第二只需要在django-suit的基础上更改。我们尝试了三种:
(1)django-databrowse.这个插件是能满足条件的,但是奈何django版本不支持其中的一些内置函数。所以放弃。
(2)手动写,参照其他人的文章写出:
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 26 27 28 29 30 31 |
from django.http import HttpResponse import datetime # Register your models here. import csv def export_to_csv(modeladmin, request, queryset): opts=modeladmin.model._meta response=HttpResponse(content_type='text/csv') response['Content-Disposition']='attachment;filename={}.csv'.format(opts.verbose_name) writer=csv.writer(response) fields = [field for field in opts.get_fields() if not field.many_to_many and not field.one_to_many] writer.writerow([field.verbose_name.encode('utf-8') for field in fields]) for obj in queryset: data_row=[] for field in fields: value=getattr(obj,field.name) if isinstance(value,datetime.datetime): value=value.strftime('%d/%m/%Y') data_row.append(value) writer.writerow(data_row) return response export_to_csv.short_description = '导出CSV' class OrderAdmin(admin.ModelAdmin): list_display = [‘id‘, ‘name‘, ‘email‘, ‘address‘, ‘postal_code‘, ‘city‘, ‘paid‘, ‘created‘, ‘updated‘] list_filter = [‘paid‘, ‘created‘, ‘updated‘] inlines = [OrderItemInline] actions = [export_to_csv] admin.site.register(Order, OrderAdmin) |
后来发现,modeladmin.model._meta, _meta这个部分在django1.5中是没有的。所以这个函数是无法实现的。只能放弃。
(3)终于找到一个很不错的django-import-export. 第一步:
1 |
$ pip install django-import-export |
第二步:
1 2 3 4 5 |
# settings.py INSTALLED_APPS = ( ... 'import_export', ) |
第三步:
1 |
$ python manage.py collectstatic |
第四步:如果按照
1 2 3 4 5 |
# app/admin.py from import_export.admin import ImportExportActionModelAdmin class BookAdmin(ImportExportActionModelAdmin): pass |
这个是不能成功的。这里有困惑,不太理解这些类是怎么工作的。所以这样不知道哪里有问题。后来参考其app例子里面的样例。改写如下:
1 2 3 4 5 6 7 8 |
from import_export.admin import ImportExportActionModelAdmin class MsgPostAdmin(ImportExportActionModelAdmin, admin.ModelAdmin): list_display = ('title','datetime','user', 'datetime') list_filter = ['user'] date_hierarchy='datetime'#另外一种过滤日期的方式 search_fields=('title','user')#搜索框 admin.site.register(MsgPost, MsgPostAdmin) |
说明,要先把export的类继承,然后再注册到admin里面才可以达到目的。经过验证,django1.5.2最多兼容到django-import-export的v0.4.2版本。
至此,完成想要的效果。
原创文章,作者:ifyoung,如若转载,请注明出处:https://www.drugfoodai.com/django-suit.html