使用django处理csv的基于类的视图和mixins。
django-separated的Python项目详细描述
基于类的视图和用于在Django中响应CSV的MIXIN。Django分离 支持django 1.3+。
安装
$ pip install django-separated
文档
django separated提供了许多工具来生成基于 奎丽塞斯。
序列化程序
分离的.utils.columnSerializer
您可以使用ColumnSerializer生成CSV。它接受列
定义,并返回可用于序列化为csv的可调用文件。
from separated.utils import ColumnSerializer
serialize_books = ColumnSerializer([
('title', 'Title'),
('pub_date', 'Publication Date'),
('isbn', 'ISBN'),
])
with open('/tmp/books.csv', 'wb') as f:
books = Book.objects.all()
serialize_books(books, file=f)
列定义是2元组的iterable,其中第一个项是
访问器从对象中获取值,第二项是列
头球。
访问器可以是字符串或可调用的。如果它不是一个可调用的,它
将传递到attrgetter以转换为可调用。如果访问器
返回一个可调用的,它将被调用。以下所有内容均有效
访问器示例:
- 'first_name'
- 'first_name.upper'
- 'get_absolute_url'
- lambda x: x.upvotes.count() - x.downvotes.count()
你甚至可以跨越关系:
- 'author'
- 'author.name'
- 'author.book_count'
- 'author.user.username'
如果希望从
访问器,您可以编写一个更简单的columns定义:
serialize_books = ColumnSerializer([
'title', # Header will be 'Title'
'pub_date', # Header will be 'Pub date'
])
你也可以混合搭配这两种风格。
默认情况下,ColumnSerializer将头作为第一行输出。如果
要禁止此行为,请将output_headers设置为False。
视图
分离视图.csvview
返回的列表视图将向用户显示CSV文件下载。它 需要将传递给ColumnSerializer
的列定义class UserCsvView(CsvView): model = User columns = [ ('first_name', 'First name'), ('last_name', 'Last name'), ('email', 'Email'), ]
如果需要的话,有一个对应的get_columns方法 更具活力的行为。
另外,您可以指定CSV文件的文件名 下载。如果没有,它将默认为模型名+_list.csv。 提供一个。例如:
class UserCsvView(CsvView): model = User
文件名为user_list.csv。但是你可以通过 设置filename属性。有一个对应的 get_filename,您可以为更复杂的行为重写它。
csvview将把output_headers的值转发给 ColumnSerializer。要关闭标题,可以执行以下操作:
class UserCsvView(CsvView): model = False output_headers = False
一个多个对象混合子类,返回一个^ {TT21} $。
如果要将baselistview替换为 你自己的列表视图。CsvResponseMixin支持所有行为 在CsvView中提到,连接它的唯一机器是 使用具有 queryset在object_list键中可用。
class MyWeirdBaseListView(View): def get(self, request, *args, **kwargs): return self.render_to_response({ 'object_list': User.objects.all(), }) class MyWeirdCsvView(CsvResponseMixin, MyWeirdBaseListView): pass
分离视图.csvresponse
将作为csv下载的httpresponse的子类。CsvResponse 需要一个filename作为构造函数的第一个参数。
管理
您可以使用管理中心中分隔的django从管理导出csv 地点。
from separated.admin import CsvExportModelAdmin class NewsAdmin(CsvExportModelAdmin): csv_export_columns = [ 'title', 'pub_date', 'author.full_name', ]
这会将操作添加到更改列表中。
csv_export_columns对应于CsvView.columns属性。如果 如果需要更细粒度的控制,可以重写csv_export_view_class 相反:
from datetime import datetime from separated.admin import CsvExportModelAdmin from separated.views import CsvView class NewsCsvView(CsvView): columns = [ 'title', 'pub_date', 'author.full_name', ] output_headers = False def get_filename(self, model): return '%s-news-export.csv' % datetime.today().strftime('Y-m-d') class NewsAdmin(CsvExportModelAdmin): csv_export_view_class = NewsCsvView
^ {TT28 } $和^ {TT30}$也作为方法存在 (分别为get_csv_export_columns和get_csv_export_view_class)如果 你需要根据要求改变它们。
from separated.admin import CsvExportModelAdmin class NewsAdmin(CsvExportModelAdmin): staff_export_columns = ( 'title', 'pub_date', 'author.full_name', ) superuser_export_columns = staff_export_columns + ( 'secret_column', ) def get_csv_export_columns(self, request): if request.user.is_superuser: return self.superuser_export_columns else: return self.staff_export_columns
吸气剂
django separated为规范化 在将模型发送到csv编写器之前将其从模型中删除。这些都是 基于处理不同类型访问器的Getter类。
分离的.utils.booleangetter
如果您希望将布尔值转换为Yes,或者 No,您可以使用BooleanGetter:
from separated.utils import BooleanGetter user_serializer = ColumnSerializer([ BooleanGetter('is_admin'), ])
分离的.utils.displaygetter
如果您有一个有选择的模型字段,并且您希望人类可读 要显示在csv中,可以使用DisplayGetter:
from separated.utils import BooleanGetter class User(models.Model): favorite_color = models.CharField(max_length=255, choices=( ('blue', 'Blue'), ('green', 'Green'), ('red', 'Red'), )) user_serializer = ColumnSerializer([ DisplayGetter('favorite_color'), ])
最后将使用django的get_favorite_color_display方法 自动添加。