Django CMS - 自定义插件中的复制关系不起作用
Django CMS - Copy relations in custom plugin not working
我在发布页面后 copy_relations 遇到了问题。
我有一个带有附加模型的插件。这个模型有我的插件的外键。
class InfContactForm(CMSPlugin):
name = models.CharField(max_length=50)
def copy_relations(self, oldinstance):
self.inf_contact_form.all().delete()
for inf_contact_form in oldinstance.inf_contact_form.all():
inf_contact_form.pk = None
inf_contact_form.plugin = self
inf_contact_form.save()
class InfContactFormAgreement(models.Model):
inf_contact_form = models.ForeignKey(InfContactForm, related_name="inf_contact_form")
agreement = HTMLField(blank=True, null=True)
然后 "InfContactFormAgreement" 模型以 "InfContactForm" 插件形式用作堆叠内联。
就像在文档中写的一样,也有 copy_relations() 方法但是当页面发布时,没有任何反应。当我再次回到编辑模式时,每次我这样做时 InfContactFormAgreement 都会加倍。
这也是我的 cms_plugins.py 文件:
class PluginInfContactForm(CMSPluginBase):
render_template = '_contact_form.html'
name = name1
model = InfContactForm
require_parent = False
inlines = [AgreementStackedInline, ]
def render(self, context, instance, placeholder):
context['instance'] = instance
context = super(PluginInfContactForm, self).render(context, instance, placeholder)
agreements = instance.inf_contact_form.all()
context.update({
'agreements': agreements,
})
return context
plugin_pool.register_plugin(PluginInfContactForm)
感谢您的任何建议。
而不是:
inf_contact_form.plugin = self
你应该使用:
inf_contact_form.inf_contact_form = self
生成的代码应如下所示:
def copy_relations(self, oldinstance):
self.inf_contact_form.all().delete()
for inf_contact_form in oldinstance.inf_contact_form.all():
inf_contact_form.pk = None
inf_contact_form.inf_contact_form = self
inf_contact_form.save()
问候
我也有类似的情况,唯一不同的是我的多对多关系不是在插件中,而是在扩展(PageExtension)中。
就我而言,@Dariusz 解决方案不起作用,我不得不更新存在于扩展模型和关联模型之间的隐式“中间”模型。
我的解决方案(关键是“通过”):
class Extension(PageExtension):
tags_regions = models.ManyToManyField(Region, related_name="articles", blank=True)
def copy_relations(self, oldinstance):
for region_tag in oldinstance.tags_regions.through.objects.filter(extension=oldinstance):
region_tag.extension = self
region_tag.save()
我在发布页面后 copy_relations 遇到了问题。 我有一个带有附加模型的插件。这个模型有我的插件的外键。
class InfContactForm(CMSPlugin):
name = models.CharField(max_length=50)
def copy_relations(self, oldinstance):
self.inf_contact_form.all().delete()
for inf_contact_form in oldinstance.inf_contact_form.all():
inf_contact_form.pk = None
inf_contact_form.plugin = self
inf_contact_form.save()
class InfContactFormAgreement(models.Model):
inf_contact_form = models.ForeignKey(InfContactForm, related_name="inf_contact_form")
agreement = HTMLField(blank=True, null=True)
然后 "InfContactFormAgreement" 模型以 "InfContactForm" 插件形式用作堆叠内联。
就像在文档中写的一样,也有 copy_relations() 方法但是当页面发布时,没有任何反应。当我再次回到编辑模式时,每次我这样做时 InfContactFormAgreement 都会加倍。
这也是我的 cms_plugins.py 文件:
class PluginInfContactForm(CMSPluginBase):
render_template = '_contact_form.html'
name = name1
model = InfContactForm
require_parent = False
inlines = [AgreementStackedInline, ]
def render(self, context, instance, placeholder):
context['instance'] = instance
context = super(PluginInfContactForm, self).render(context, instance, placeholder)
agreements = instance.inf_contact_form.all()
context.update({
'agreements': agreements,
})
return context
plugin_pool.register_plugin(PluginInfContactForm)
感谢您的任何建议。
而不是:
inf_contact_form.plugin = self
你应该使用:
inf_contact_form.inf_contact_form = self
生成的代码应如下所示:
def copy_relations(self, oldinstance):
self.inf_contact_form.all().delete()
for inf_contact_form in oldinstance.inf_contact_form.all():
inf_contact_form.pk = None
inf_contact_form.inf_contact_form = self
inf_contact_form.save()
问候
我也有类似的情况,唯一不同的是我的多对多关系不是在插件中,而是在扩展(PageExtension)中。 就我而言,@Dariusz 解决方案不起作用,我不得不更新存在于扩展模型和关联模型之间的隐式“中间”模型。
我的解决方案(关键是“通过”):
class Extension(PageExtension):
tags_regions = models.ManyToManyField(Region, related_name="articles", blank=True)
def copy_relations(self, oldinstance):
for region_tag in oldinstance.tags_regions.through.objects.filter(extension=oldinstance):
region_tag.extension = self
region_tag.save()