在Django中定义模型, 常常会给出verbose_name, 一方面帮助自己理解字段含义; 另一方面,能够给django admin 用于字段显示.
class Meeting(models.Model):
CATEGORY_CHOICES = (
('0', '类型1'),
('1', '类型2'),
)
name = models.CharField(max_length=100, verbose_name='名称')
datetime = models.DateTimeField('时间')
category = models.CharField(choices=CATEGORY_CHOICES, max_length=1, verbose_name='类型')
如果前端来写这个模型的CRUD, 还需要再次定义模型,包括字段以及其显示名称. 这里明显有个重复工作.
理论上, 既然django admin能够自动生成CRUD, 我们自己写的前端, 也应该能够具备这种能力. 如何获取这种能力呢?
Django 模型类的 _meta
字段给我们提供了所需信息.例如,想要知道模型有哪些字段,以及字段的显示, 可以增加一个类方法如下:
class Meeting(models.Model):
CATEGORY_CHOICES = (
('0', '类型1'),
('1', '类型2'),
)
name = models.CharField(max_length=100, verbose_name='名称')
datetime = models.DateTimeField('时间')
category = models.CharField(choices=CATEGORY_CHOICES, max_length=1, verbose_name='类型')
@classmethod
def dictionary(cls):
return {f.name: f.verbose_name for f in cls._meta.fields}
>>> Meeting.dictionary()
{'id': 'ID', 'name': '名称', 'datetime': '时间', 'category': '类型'}
把这个数据送给前端, 前端就能够自动获取字段信息.
当然, 如果进一步挖掘, 还可以给前端提供更为丰富的信息, 例如字段类型/校验信息/候选项/外键关联等信息. 把这些做到极致, 就相当于实现了前后端分离条件下的Django admin.
但这个思路的缺点也是显而易见的, 与Django admin在服务端渲染不同, 这个实现方案中, 页面在运行时才能得到渲染数据, 性能可能会有损失.
网友评论