2017-02-02 29 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