【问题标题】:Django custom field with 2 fields具有 2 个字段的 Django 自定义字段
【发布时间】:2017-01-28 10:11:10
【问题描述】:

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

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

【问题讨论】:

  • 你想要一个字段来存储boty raw markdown和html?

标签: django model field


【解决方案1】:

我认为您可以定义两个字段来保留降价文本和编译 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()

通过这种方法,您始终可以使用 markdown 字段使您的 html 字段保持最新。 html 字段在模型保存时自动更新,因此您无需在调用模型save 方法之前为其分配任何值。

【讨论】:

    【解决方案2】:

    为工作使用正确的工具(tm)。

    • 使用自定义字段来处理 one python 对象以存储在 one 字段中。这里的目标是从存储格式转换为功能对象,反之亦然。可以使用多个字段,但很棘手。以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 进行检查。

    【讨论】:

    • 创建一个自定义字段是否有意义,该字段实际上是我的模型的外键,同时具有这两种信息?
    • 如果走自定义字段路由,可以使用 ImageField 作为示例。这两个优点是您不受固定字段名称(在我的示例中为markdown 和compiled_html)的约束,并且您可以使用多个markdown 字段,每个字段在一个模型上都有自己的编译html。正如您从 ImageField 中看到的那样,引入的复杂性(以及性能)是巨大的,因此您必须考虑这些优势是否解决了现实世界的问题。
    • 是的,我必须使用自定义字段,我有一些模型包含多个需要降价的文本字段。我真的不明白如何制作一个内部具有多个值的自定义字段。我想用markdown和compiled_html为我的模型创建一个自定义OneToOneField
    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2019-01-26
    • 2021-10-19
    • 2013-05-15
    • 2015-06-03
    相关资源
    最近更新 更多