我有一个简单的自定义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;并且可以在左侧管理侧边栏中看到。
然后,在切换到&#39; live&#39;后,图标不会显示。此外,&#39;测试&#39;列表已在管理面板中重复。
切换回&#39;草稿&#39;,在插件模板中呈现两个具有相同名称的列表。
不可否认是django(cms)及其概念的新手,我不太清楚该怎么做。有没有人有想法?
答案 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.py
和cms_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上的其他人插件并分析他们如何将模型绑定到admin
和cms_plugins
之后,这是我的结论。如果我错了,请纠正我。