具有 2 个字段的 Django 自定义字段

标签 django model field

我找到了一个 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/

相关文章:

python - 有没有办法将SearchQuerySet 转换为objects.filter 返回的类型? - Django

用于管理 dns 和 dhcp 的 Python 模块

python - 如何在 Django 中的产品过滤功能中获取公司名称?

wpf - WCF 服务公开 DTO 或实体

mysql - 如何设计这个简单的数据库?

python - Django:相互引用的静态文件。

python - 如何从 HTML 获取 Python 数组的第一个元素

java - 是否有针对我要解决的问题的 Java 设计模式?

sql - SSRS 2005 字段中不同值的总和

delphi - 读取Web浏览器输入字段中的内容