2016-09-20 77 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 –