【问题标题】:create collection with python code使用 python 代码创建集合
【发布时间】:2017-08-27 23:28:37
【问题描述】:

我想制作一个模型,允许 Wagtail 管理站点中的用户选择图像目录,并在 CharField 中给出集合的名称,然后按下按钮,将创建具有给定名称的集合,然后将给定目录中的图像保存到数据库中(以便它们在 CMS 中可用)。图片的标题是它的文件名,而它的标签是找到图片的目录名。

我发现了另一篇关于如何使用代码将图像保存到数据库的帖子 (image saving) 但我在以编程方式创建集合时遇到问题。我在这里发现这段代码 (from here) 应该可以工作,但显然对我来说不行,当我执行 manage.py makemigrations 时,我收到此错误:

django.db.utils.IntegrityError: UNIQUE constraint failed: wagtailcore_collection.path

我需要在 add_child 中提供路径吗?它应该是什么路径? 提前感谢您的帮助!

root_coll = Collection.get_first_root_node()
root_coll.add_child(name='testcoll')

【问题讨论】:

  • 请问您能显示 IntegrityError 的完整堆栈跟踪吗?我有点不明白为什么会在makemigrations 步骤上发生这种情况...
  • 请在 err_trace.log 中找到完整的错误消息 link。 model.py 在那里,注意我对 Wagtail 真的很陌生,所以欢迎任何帮助!
  • 只是一个与编码相关的问题:Image 对象可以像这样实例化是如何工作的: Image(title="Image title", file=ImageFile(image_file, name="image-filename.jpg “))?当我查看the class definition 时,我没有看到任何 init 方法,但这些(标题、文件)是 AbstractImage 类的类变量,然后由 Image 继承。那么为什么在实例化 Image 时可以使用这些作为参数,为什么没有 init
  • 该行为由 Django 的基类 Model 提供,此处描述:docs.djangoproject.com/en/1.10/topics/db/models

标签: wagtail


【解决方案1】:

问题是您直接在GalleryPage 的定义内运行代码:

class GalleryPage(Page):
    # test
    root_coll = Collection.get_first_root_node()
    root_coll.add_child(name='testcoll')

这将在每次加载 models.py 时运行 - 特别是,./manage.py makemigrations./manage.py migrate 命令需要加载 models.py 以了解如何设置数据库。那个时候创建​​数据库对象自然会失败,因为数据库还没有准备好……

像这样运行测试代码的最佳位置可能是./manage.py shell 命令行,您应该能够成功运行以下行:

from wagtail.wagtailcore.models import Collection
root_coll = Collection.get_first_root_node()
root_coll.add_child(name='testcoll')

【讨论】:

  • 对于 Wagtail 2+,使用 from wagtail.core.models import Collection
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2017-03-05
  • 2012-11-12
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
相关资源
最近更新 更多