我找到了一个 Markdown 编辑器,我正在对其进行调整以使其与 Django 配合良好。我想要一个字段来存储原始 markdown 和一个用于优化目的的已编译 HTML。我想创建一个自定义字段和小部件来隐藏复杂性并使其在我网站的任何地方都可以重复使用。 在这个自定义字段中,我想有两个文本字段,但我没有找到是否可能。 我的其他解决方案是:
- 拥有一个包含这两个字段的模型,而我的自定义字段实际上是该模型的外键。我喜欢这个,因为为所有东西做一些迁移真的很容易,也许实现会有些棘手。
- 用这两个字段创建一个抽象模型。我重写保存方法来填充 html 条目
最佳答案
为工作使用正确的工具 (tm)。
使用自定义字段来处理要存储在one 字段中的one python 对象。这里的目标是从存储格式转换为功能对象,反之亦然。可以使用多个字段,但很棘手。查看ImageField举个例子。
使用继承来为模型增加一个或多个字段、方法以及您想要的任何东西。这里的目标是能够重用代码。
class CompilableMarkdownBase(models.Model): markdown = models.TextField(default='[//]: # (Start Markdown here)') compiled_html = models.TextField(editable=False, null=True) def clean(self): if self.markdown != models.NOT_PROVIDED: self.compiled_html = compile_html(self.markdown) class Meta: abstract = True
我们在 clean() 中执行此操作,而不是保存,因为它是为此而设计的:根据其他字段更改提交的表单数据或数据库存储。由于 python 支持多重继承,因此您可以将其附加到任何模型上。使用Mezzanine举个例子:
class ProductPage(Page, CompilableMarkdownBase):
pass
请注意字段名称冲突,您可以使用 ./manage.py check
检查。
关于具有 2 个字段的 Django 自定义字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39594875/