I'm building an app for my Django 1.5.1 and Django-cms installation. The app meant to permit to upload an image linked to an URL. My code :
cms_plugins.py
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from cms.plugins.text.widgets.wymeditor_widget import WYMEditor
from django.forms.fields import CharField
from models import ImageText
class ImageTextPlugin(CMSPluginBase):
model = ImageText
name = "video wall"
render_template = "video.html"
def render(self, context, instance, placeholder):
context.update({
'object':instance,
})
return context
plugin_pool.register_plugin(ImageTextPlugin)
models.py
from django.db import models
from django.db.models import fields
from filer.fields.image import FilerImageField
from filer.fields.file import FilerFileField
from cms.models import CMSPlugin
class ImageText(CMSPlugin):
image = FilerImageField(related_name="image0")
link = models.CharField(max_length=255, blank=True)
admin.py
from django.contrib import admin
from models import ImageText
class ImageTextAdmin(admin.ModelAdmin):
pass
admin.site.register(ImageText, ImageTextAdmin)
video.html
<a class="fancybox fancybox.iframe" rel="group" href="{{ instance.link }}">
<div class="video">
<img alt="work module image" src="{{ instance.image }}" />
</div>
</a>
When I try to install an instance of my app in a cms placeholder I have this error:
ValueError at /admin/cms/page/51/edit-plugin/1839/
Cannot assign "''": "ImageText.link" must be a "Link" instance.
I don't understand what causing that. Any idea?
my pip freeze
BeautifulSoup==3.2.1
Django==1.5.1
MySQL-python==1.2.4
PIL==1.1.7
Pillow==2.2.1
South==0.8.2
cmsplugin-filer==0.9.5
cmsplugin-zinnia==0.4
django-appconf==0.6
django-blog-zinnia==0.12.3
django-classy-tags==0.4
django-cms==2.4.2
django-filer==0.9.5
django-haystack==1.2.7
django-mptt==0.5.2
django-polymorphic==0.5.3
django-sekizai==0.7
django-tagging==0.3.1
django-tinymce==1.5.1
django-twitter-tag==1.2
django-xmlrpc==0.1.5
easy-thumbnails==1.4
html5lib==1.0b3
pyparsing==1.5.7
pysolr==3.1.0
pytz==2013.7
requests==2.0.1
six==1.2.0
twitter==1.9.1
wsgiref==0.1.2
The problem here has not much to do with your schema specifically but with how django handles
OneToOnerelationships.When you subclass
CMSPlugin, django creates an implicitOneToOnerelationship from your model to theCMSPluginand vice versa.This being the case, imagine the following scenario:
I have a plugin called
Title:the model above would have access to the
CMSPlugintable via acmsplugin_ptrattribute and aCMSPlugininstance would have access to it'sTitlevia the automatically created attribute "title" <-- classname.lower()So given the example above, if now I want another plugin called
Videohere's the problem, when you save the video plugin, the
titlefield clashes with the automatically generated title attribute from the previous plugin thus throwing aCannot assign "''": "VideoPlugin.title" must be a "Title" instance.This is mentioned very lightly in the docs.
So all you have to do in your case is rename the
linkfield to something else. I usually name the fields of my plugins with their classname, so in your case I would end up withthis way you are sure to avoid any clashes with other plugins.