Джанго вложенные строки - PullRequest
       11

Джанго вложенные строки

0 голосов
/ 14 января 2019

Я работаю над нестандартным плагином Django CMS и столкнулся с ситуацией, когда мне нужны вложенные строки. Ниже приведены мои модельные структуры.

class Link(NavLink):
    card = models.ForeignKey('CardPanel', related_name='card_links')

class CardPanel(models.Model):
    title = models.CharField(max_length=50)
    image = FilerImageField(null=True, blank=True, related_name="navigation_vertical_link_image")
    link_description = HTMLField(blank=True, null=True, max_length=150)
    button_link_internal = PageField(blank=True, null=True)
    button_link_external = models.URLField(blank=True, null=True)
    plugin = models.ForeignKey('Panel')

class Panel(CMSPlugin):
    pass

В идеале мне нужны вложенные строки. Так как модель Link имеет отношение m: 1 с CardPanel, а CardPanel имеет отношение m: 1 с моделью Panel, я хочу иметь возможность добавить несколько CardPanel, содержащих несколько моделей Link. Как лучше всего добиться этого через ModelAdmin в Django?

1 Ответ

0 голосов
/ 14 января 2019

Если это плагин, который вы создаете здесь, то, начиная с версии 3.0, они управляются только из внешнего интерфейса :

В новой системе Placeholders и их плагины больше не управляются на сайте администратора, а только из внешнего интерфейса.

Итак, есть различные атрибуты CMSPlugins, которые, я думаю, вы найдете для этого полезными, включая некоторые стандартные плагины, которые поставляются с CMS. Вам также не нужно указывать атрибут plugin в вашей модели, если он для плагина.

Я бы настроил ваш класс плагинов и соответствующую модель так, чтобы они были немного похожи;

# models.py
from cms.models.fields import PlaceholderField

class CardPanel(CMSPlugin):
    title = models.CharField(max_length=50)
    image = FilerImageField(
        null=True,
        blank=True,
        related_name="navigation_vertical_link_image"
    )
    content = PlaceholderField('card_panel_content')

# cms_plugins.py

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool

from .models import CardPanel


@plugin_pool.register_plugin
class CardPanel(CMSPluginBase):
    """ Plugin to contain card panels """
    model = CardPanel
    parent_classes = ['Panel']  # Include this if a card panel only exists in a panel

@plugin_pool.register_plugin
class Panel(CMSPluginBase):
    """ Plugin to contain card panels """
    model = CMSPlugin
    allow_children = True  # Allow the Panel to include other plugins
    child_classes = ['CardPanel']

Включив PlaceholderField в CardPanel, вы можете отобразить заполнитель для экземпляра модели и добавить плагины CMS к этому экземпляру так же, как вы можете добавить их на страницу. Таким образом, вы можете просто добавить столько плагинов для ссылок, сколько вам нужно, и этот плагин , если вы его не используете, допускает ссылки на страницы или внешние ссылки.

Поле заполнителя отображается в шаблоне следующим образом:

{% load cms_tags %}

{% render_placeholder card_panel_instance.content %}

PlaceholderField также может быть зарегистрирован с помощью администратора; http://docs.django -cms.org / ен / последний / how_to / placeholders.html # админ-интеграция

...