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()