如何修复 djangocms-forms 中的“PluginReferenceField”对象没有属性“rel”fields.py

问题描述

class PluginReferenceField(models.ForeignKey):
    def __init__(self,*args,**kwargs):
        kwargs.update({'null': True})  # always allow Null
        kwargs.update({'editable': False})  # never allow edits in admin
        kwargs.update({'on_delete': SET_NULL})  # never delete plugin
        super(PluginReferenceField,self).__init__(*args,**kwargs)

    def _create(self,model_instance):
        return self.rel.to._default_manager.create(name=model_instance.name)

    def pre_save(self,model_instance,add):
        if not model_instance.pk and add:
            setattr(model_instance,self.name,self._create(model_instance))
        else:
            reference = getattr(model_instance,self.name)
            if not reference:
                setattr(model_instance,self._create(model_instance))
                reference = getattr(model_instance,self.name)
            if reference.name != model_instance.name:
                reference.name = model_instance.name
                reference.save()
        return super(PluginReferenceField,self).pre_save(model_instance,add)

解决方法

我在设置 djangocms 和安装 djangocms-forms 后遇到了类似的问题。

看起来“rel.to”在 2.0 中已经贬值了。见票 https://code.djangoproject.com/ticket/24317

在 djangocms_forms 包的 fields.py 的第 66-67 行,更改

def _create(self,model_instance):
    return self.rel.to._default_manager.create(name=model_instance.name)

def _create(self,model_instance):
    return self.related_model._default_manager.create(name=model_instance.name)

事后您可能还需要删除 forms.py:348 中“user.is_authenticated”的“()”。我需要做进一步的调试,因为我在之后立即遇到了 this issue

我能够让 djangocms-forms 在 Django 3.1.4 版上成功运行。