django app:无法指定"''":"ImageText.link"必须是"链接"实例

Ale*_*lli 2 python django django-models django-cms django-1.5

我正在为我的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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

admin.py

 from django.contrib import admin
 from models import ImageText

 class ImageTextAdmin(admin.ModelAdmin):
    pass


  admin.site.register(ImageText, ImageTextAdmin)
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

当我尝试在cms占位符中安装我的应用程序实例时出现此错误:

 ValueError at /admin/cms/page/51/edit-plugin/1839/
 Cannot assign "''": "ImageText.link" must be a "Link" instance.
Run Code Online (Sandbox Code Playgroud)

我不明白是什么造成的.任何的想法?

我的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
Run Code Online (Sandbox Code Playgroud)

Pau*_*ulo 7

这里的问题与您的架构没有多大关系,而是django如何处理OneToOne关系.

当你CMSPlugin继承子类时,django会创建一个OneToOne从模型到CMSPlugin反之的隐式关系,反之亦然.

在这种情况下,想象一下以下场景:

我有一个名为的插件Title:

class Title(CMSPlugin):
    text = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)

上面的模型可以CMSPlugin通过cmsplugin_ptr属性访问表,CMSPlugin实例可以Title通过自动创建的属性"title"< - classname.lower()访问它.

所以考虑到上面的例子,如果现在我想要另一个调用的插件 Video

class VideoPlugin(CMSPlugin):
    title = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)

这就是问题所在,当您保存视频插件时,该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)
Run Code Online (Sandbox Code Playgroud)

这样你就可以避免与其他插件发生任何冲突.

  • 这在技术意义上是准确的,并且可能是事情已经变得棘手的唯一出路.更清晰的方法是就插件类本身的命名约定达成一致.如果每个插件作者都同意在插件模型中添加`Plugin`后缀,那么这不是问题.我在django-cms打开了一个问题:https://github.com/divio/django-cms/issues/3204 (2认同)