2016-09-20 79 views
0

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

  • 有与这两个领域的模型和我的自定义字段实际上是一个外键这种模式。我喜欢这个,因为为一切做一些迁移非常简单,也许实现会有些棘手。
  • 用这两个字段创建抽象模型。我重写保存方法来填充HTML入门
+0

你想要一个字段来存储boty原始markdown和html? – Windsooon

回答

0

我想你可以定义两个领域保持降价文本和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方法之前,您无需为其指定任何值。

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 
    

我们在做这个干净的(),不保存,因为它是为它制作:改变基于其他领域提交的表单数据或数据库存储。既然python支持多重继承,你可以在任何模型上使用它。使用Mezzanine为例:

class ProductPage(Page, CompilableMarkdownBase): 
    pass 

要知道字段名称冲突,您可以与./manage.py check检查。

+0

创建一个自定义字段是否有意义,它实际上是我的模型中包含这两种信息的外键? –

+0

如果您使用自定义字段路由,则可以使用ImageField作为示例。两个好处是你没有绑定到固定字段名称(在我的例子中是markdown和compiled_html),你可以使用多个markdown字段,每个字段在一个模型上都有自己编译好的html。从ImageField中可以看到,引入的复杂性(以及性能)非常庞大,因此您必须考虑优势是否解决了真实世界的问题。 – Melvyn

+0

是的,我必须使用自定义字段,我有一些模型可以容纳多个需要降价的文本字段。我真的不知道如何制作一个有多个值的自定义字段。我想用markdown和compiled_html为我的模型创建一个自定义的OneToOneField –