我找到了一个降价编辑器,我正在适应它以使其与Django一起使用。我希望有一个字段来存储原始markdown和一个用于编译HTML的字段以进行优化。我想创建一个自定义字段和小部件来隐藏复杂性,并使其可以在我的网站上的任何地方重复使用。 在这个自定义字段中,我想有两个文本字段,但我没有找到是否可能。 我的其他解决方案是:
答案 0 :(得分:0)
我认为您可以定义两个字段来保留markdown文本并编译HTML文本,并覆盖模型的save
方法。每次要保存模型时,都要调用HTML编译方法。您的代码可能如下所示:
class Article(model.Model):
markdown = model.TextField('markdown text')
html = model.TextField('html text')
def save(self):
self.html = html_compile(self.markdown) # <-- replace with your html compile function here
super(Article, self).save()
使用此方法,您始终可以使html
字段与markdown
字段保持同步。模型保存时会自动更新html
字段,因此在调用模型save
方法之前,您无需为其指定任何值。
答案 1 :(得分:0)
使用正确的工具(tm)。
使用自定义字段处理要存储在一个字段中的一个 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
进行检查。