2017-02-02 27 views
2

在實現Django CMS站點時,我有點卡在鏈接管理(內部或外部)上。在我的項目中,我有一個特定的插件,運營商經常使用它。我在問題的最後添加了編輯對話框和框渲染的截圖。帶有可編輯鏈接元素的插件

編輯對話框很好,但現在按鈕只是一個字符字段。因此,鏈接選擇(包括Django CMS中的頁面或外部URL)缺失。我尋找一個鏈接領域,但直到現在我迷路了。

如何添加功能讓操作員選擇內部或外部鏈接?

該插件由以下幾部分組成:

models.py

from django.db import models 
from cms.models.pluginmodel import CMSPlugin 
from djangocms_text_ckeditor.fields import HTMLField 

class CardPlugin(CMSPlugin): 
    title = models.CharField(max_length=256,default='') 
    description = HTMLField(configuration='CKEDITOR_SETTINGS', 
          default='') 
    button = models.CharField(max_length=256,default='') 

    def __str__(self): 
     return str(self.title) 

cms_plugins.py

class CardCMSPlugin(CMSPluginBase): 
    model = CardPlugin 
    name = 'Card' 
    render_template = "card-default.html" 

卡default.html中

{% load cms_tags %} 
<section class="card card--primary-light"> 
    <div class="card__inner"> 
    <div class="card__content"> 
     <div class="card__text"> 
     <h2 class="card__title"> 
      {{ instance.title }} 
     </h2> 
     <p class="card__description"> 
      {{ instance.description }} 
     </p> 
     </div> 
     {% if instance.button %} 
     <div class="card__buttons"> 
      <a href="#0" class="button button--primary-inverse">{{ instance.button }}</a> 
     </div> 
     {% endif %} 
    </div> 
    </div> 
</section> 

呈現箱

The rendered box

插件編輯對話框如下:

the plugin edit dialog

回答

3

我建議看添加djangocms鏈接插件作爲一個孩子的插件。這是一個非常好的插件,可鏈接到內部CMS頁面或外部地址。這樣,您可以從模型中刪除button字段,而是在模板中呈現子插件。

nested plugins的文檔將是一個很好的閱讀。

你的插件定義會變成類似這樣的東西;

class ParentCMSPlugin(CMSPluginBase): 
    render_template = 'parent.html' 
    name = 'Parent' 
    model = ParentPlugin 
    allow_children = True 
    child_classes = ['LinkPlugin'] 

要渲染子插件,然後使用您的模板執行此操作;

{% load cms_tags %} 
<section class="card card--primary-light"> 
    <div class="card__inner"> 
     <div class="card__content"> 
      <div class="card__text"> 
       <h2 class="card__title"> 
        {{ instance.title }} 
       </h2> 
       <p class="card__description"> 
        {{ instance.description }} 
       </p> 
      </div> 
      {% for plugin in instance.child_plugin_instances %} 
       {% render_plugin plugin %} 
      {% endfor %} 
     </div> 
    </div> 
</section> 

而且這將使用子插件的默認渲染模板。如果默認不匹配的造型等等,你可以處理的模板,而不是使用render_plugin或子類LinkPlugin渲染工作,你怎麼想,或延長它的屬性等

一些進一步的考慮應該做的下降你的描述字段支持同樣使用TextPlugin作爲孩子,因爲CMS文本插件可以在它自己內部嵌套插件,並且我總是使用它來覆蓋HTMLField

更進一步,如果你正在開發中CMS掛鉤的應用程序,看看PlaceholderFields,讓你可以創建自己的模型佔位符舉行&使用,你可以在CMS頁面使用CMS插件。這對於新聞應用程序或博客風格內容等等非常有用。

+0

我事先嚐試了兒童插件解決方案。我把Text插件作爲盒子插件的孩子。但這似乎有點膚淺。現在添加一個新盒子的方法非常快捷:在三個字段中添加盒子和標籤,然後按回車鍵。完成。添加孩子對用戶來說確實是一種負擔,使得結構變得更加複雜,而沒有獲得任何東西。所以沒有像LinkField或什麼的? 我沒有看到PlaceholderFields適用於我的問題,因爲它是一個CMS插件,對不對? – itsafire

+0

這不是一種負擔,它只是使用django-cms更典型的方式。你可以爲你的模型添加一個'LinkField',然後'instance.linkfield'就是你的按鈕的'href'屬性。然而,你遇到的麻煩是你沒有[鏈接插件](https://github.com/divio/djangocms-link)的權力鏈接到頁面或外部URL或其他設置,如類或模板。而'PlaceholderField'就是你可能想要考慮的事情,當你不熟悉它時,我會很有幫助。 –

+0

但是我在我的模型中使用了djangocms_text_ckeditor.fields提供的HTMLField,並且在我的插件中有完整的編輯器。這似乎很強大。這在Django CMS中被認爲是不好的設計?那麼當有人需要將他的需求分散到更小的無關位時,那麼插件有什麼意義呢? – itsafire