【问题标题】:djangocms custom plugin duplicating behaviordjangocms 自定义插件复制行为
【发布时间】:2015-01-23 05:24:27
【问题描述】:

我有一个简单的自定义 djangocms 插件,它在发布更改时行为异常。

完整代码在这个 repo 中:https://github.com/creimers/djangocms_sociallist

这是模型:

class SocialList(CMSPlugin):

    name = models.CharField(
        'Liste',
        blank=False,
        default='',
        max_length=32,
    )

def copy_relations(self, oldinstance):
    for associated_item in oldinstance.associated_item.all():
        associated_item.pk = None
        associated_item.plugin = self
        associated_item.save()

def __unicode__(self):
    return u'%s' % self.name


class SocialIcon(models.Model):
    choices = (
        ('fa-facebook', 'facebook'),
        ('fa-google-plus', 'google-plus'),
        ('fa-twitter', 'twitter'),
        ('fa-instagram', 'instagram'),
        ('fa-yelp', 'yelp'),
        ('fa-youtube-play', 'youtube'),
        ('fa-foursquare', 'foursquare'),
    )
    social_list = models.ForeignKey(
        SocialList,
        related_name="associated_item"
    )
    icon = models.CharField(
        max_length=200,
        blank=False,
        choices=choices,
    )
    link = models.URLField(
        max_length=200,
        blank=False
    )

    def __unicode__(self):
        return u'%s' % self.icon

这是cms_plugins.py

class ChoiceInline(admin.TabularInline):
    model = SocialIcon
    extra = 1


class SocialPlugin(CMSPluginBase):
    name = u'Social Icons'
    model = SocialList
    render_template = "djangocms_sociallist/_social_plugin.html"
    #form = SocialListPluginAdminForm
    inlines = [ChoiceInline, ]

    def render(self, context, instance, placeholder):
        items = instance.associated_item.all()
        context.update({
            'items': items,
            'instance': instance,
        })
        return context

plugin_pool.register_plugin(SocialPlugin)

这是模板:

<div class="social-list-container">
    <ul class="social-list">
        {% for icon in items %}
        <a href="{{icon.link}}">
            <li class="social-list-item">
                <i class="fa {{icon.icon}}"></i>
            </li>
        </a>
        {% endfor %}
    </ul>
</div>

在草稿模式下,一切正常。当我点击“发布更改”时会发生奇怪的事情。

这是草稿模式。我添加了三个图标。图标列表称为“测试”,可以在左侧管理边栏中看到。

然后,切换到“实时”后,图标不显示。此外,管理面板中的“测试”列表已重复。

切换回'draft',插件模板中呈现两个同名列表。

诚然,对于 django(cms) 及其概念来说是新手,我不太清楚该怎么做。有人有想法吗?

【问题讨论】:

    标签: python-2.7 plugins django-cms django-1.6


    【解决方案1】:

    我可以部分回答我的问题:

    associated_item.plugin = self 当然应该是associated_item.social_list = self。我只是忘了插入我的特定模型参考的名称。

    这就是我的copy_relations 现在的样子:

    def copy_relations(self, oldinstance):
        for associated_item in oldinstance.associated_item.all():
            associated_item.pk = None
            associated_item.social_list = self
            associated_item.save()
    

    我现在可以发布我的插件并且它不会消失。

    关于复制行为:

    我认为问题是我一直在搞乱我不应该搞砸的地方。

    我采用相同的模型(继承自 CMSPlugin)并在 admin.pycms_plugins.py 中引用它。相反,我认为我应该这样做:

    class SocialList(models.Model):
    
        name = models.CharField(
            'Liste',
            blank=False,
            default='',
            max_length=32,
        )
    
        def copy_relations(self, oldinstance):
            for associated_item in oldinstance.associated_item.all():
                associated_item.pk = None
                associated_item.social_list = self
                associated_item.save()
    
        def __unicode__(self):
            return u'%s' % self.name
    
        class SocialListPlugin(CMSPlugin):
    
            list = models.ForeignKey(SocialList)
    
            def __unicode__(self):
                return u'%s' % self.list.name
    

    因此是关注点分离。

    这是我在挖掘 github 上其他人的插件并分析他们如何将模型绑定到 admincms_plugins 后得出的结论。如果我错了,请纠正我。

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 2020-12-14
      • 2011-08-23
      • 2015-10-17
      • 2016-12-15
      • 2021-01-15
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多