问题描述
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 版上成功运行。