Django自定义字段,包含2个字段

时间:2016-09-20 13:02:27

标签: django model field

我找到了一个降价编辑器,我正在适应它以使其与Django一起使用。我希望有一个字段来存储原始markdown和一个用于编译HTML的字段以进行优化。我想创建一个自定义字段和小部件来隐藏复杂性,并使其可以在我的网站上的任何地方重复使用。 在这个自定义字段中,我想有两个文本字段,但我没有找到是否可能。 我的其他解决方案是:

  • 要有一个包含这两个字段的模型,我的自定义字段实际上是此模型的外键。我喜欢这个,因为为一切做一些迁移真的很容易,也许实现会有些棘手。
  • 使用这两个字段创建抽象模型。我重写了save方法来填充html条目

2 个答案:

答案 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进行检查。