我正在为我的Django 1.5.1和Django-cms安装构建一个应用程序.该应用程序旨在允许上传链接到URL的图像.我的代码:
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
当我尝试在cms占位符中安装我的应用程序实例时出现此错误:
ValueError at /admin/cms/page/51/edit-plugin/1839/ Cannot assign "''": "ImageText.link" must be a "Link" instance.
我不明白是什么造成的.任何的想法?
我的pip冻结了
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
Paulo.. 7
这里的问题与您的架构没有多大关系,而是django如何处理OneToOne
关系.
当你CMSPlugin
继承子类时,django会创建一个OneToOne
从模型到CMSPlugin
反之的隐式关系,反之亦然.
在这种情况下,想象一下以下场景:
我有一个名为的插件Title
:
class Title(CMSPlugin): text = models.CharField(max_length=200)
上面的模型可以CMSPlugin
通过cmsplugin_ptr
属性访问表,CMSPlugin
实例可以Title
通过自动创建的属性"title"< - classname.lower()访问它.
所以考虑到上面的例子,如果现在我想要另一个调用的插件 Video
class VideoPlugin(CMSPlugin): title = models.CharField(max_length=200)
这就是问题所在,当您保存视频插件时,该title
字段会与上一个插件中自动生成的title属性冲突,从而抛出一个
Cannot assign "''": "VideoPlugin.title" must be a "Title" instance
.
在文档中非常轻易地提到了这一点.
因此,在您的情况下,您需要做的就是将link
字段重命名为其他内容.我通常用他们的类名命名我的插件的字段,所以在你的情况下我最终会得到
class ImageText(CMSPlugin): image_text_image = FilerImageField(related_name="image0") image_text_link = models.CharField(max_length=255, blank=True)
这样你就可以避免与其他插件发生任何冲突.
这里的问题与您的架构没有多大关系,而是django如何处理OneToOne
关系.
当你CMSPlugin
继承子类时,django会创建一个OneToOne
从模型到CMSPlugin
反之的隐式关系,反之亦然.
在这种情况下,想象一下以下场景:
我有一个名为的插件Title
:
class Title(CMSPlugin): text = models.CharField(max_length=200)
上面的模型可以CMSPlugin
通过cmsplugin_ptr
属性访问表,CMSPlugin
实例可以Title
通过自动创建的属性"title"< - classname.lower()访问它.
所以考虑到上面的例子,如果现在我想要另一个调用的插件 Video
class VideoPlugin(CMSPlugin): title = models.CharField(max_length=200)
这就是问题所在,当您保存视频插件时,该title
字段会与上一个插件中自动生成的title属性冲突,从而抛出一个
Cannot assign "''": "VideoPlugin.title" must be a "Title" instance
.
在文档中非常轻易地提到了这一点.
因此,在您的情况下,您需要做的就是将link
字段重命名为其他内容.我通常用他们的类名命名我的插件的字段,所以在你的情况下我最终会得到
class ImageText(CMSPlugin): image_text_image = FilerImageField(related_name="image0") image_text_link = models.CharField(max_length=255, blank=True)
这样你就可以避免与其他插件发生任何冲突.