2017-02-02 14 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' attr вашей кнопки. Однако проблема в том, что у вас нет возможности плагина [link plugin] (https://github.com/divio/djangocms-link) для ссылки на страницы или внешние URL-адреса или дополнительные настройки, такие как классы или шаблоны , И «PlaceholderField» - это то, что вы, возможно, захотите заглянуть, я могу помочь вам, если вы не знакомы с ним. –

+0

Но я использую HTMLField, предоставленный djangocms_text_ckeditor.fields в моей модели, и у меня есть полноценный редактор в моем плагине. Это кажется настолько сильным. Является ли это плохой дизайн в Django CMS? Какой смысл тогда иметь плагины, когда нужно снова разогнать свои потребности на более мелкие несвязанные биты? – itsafire