djangocms自定义插件重复行为

时间:2014-11-25 09:20:46

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

我有一个简单的自定义djangocms插件,在发布更改时会有奇怪的行为。

完整代码位于此仓库: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>

在草稿模式中,一切都按照我的预期运作。当我点击发布更改时会发生奇怪的事情。

这是草稿模式。我添加了三个图标。图标列表名为&#39; test&#39;并且可以在左侧管理侧边栏中看到。

DRAFT MODE

然后,在切换到&#39; live&#39;后,图标不会显示。此外,&#39;测试&#39;列表已在管理面板中重复。

LIVE MODE

切换回&#39;草稿&#39;,在插件模板中呈现两个具有相同名称的列表。

BACK TO DRAFT

不可否认是django(cms)及其概念的新手,我不太清楚该怎么做。有没有人有想法?

1 个答案:

答案 0 :(得分:0)

我可以对我的问题给出部分答案:

当然,

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之后,这是我的结论。如果我错了,请纠正我。