عند استخدام StructBlock في النماذج
لقد اكتشفت أن هذا الأمر قد تعطل عندما يحاول تصدير هذا النموذج:
from wagtail.wagtailcore import blocks
from wagtail.wagtailimages.blocks import ImageChooserBlock
class ImageBlock(blocks.StructBlock):
image = ImageChooserBlock()
description = blocks.CharBlock()
class Meta:
icon = 'image'
template = 'image.html'
فقط افعل:
python3 manage.py dumpdata --traceback
ويحدث استثناء:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "C:\Soft\python\venv\lib\site-packages\django\core\management\__init__.py", line 367, in execute_from_command_line
utility.execute()
File "C:\Soft\python\venv\lib\site-packages\django\core\management\__init__.py", line 359, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Soft\python\venv\lib\site-packages\django\core\management\base.py", line 294, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Soft\python\venv\lib\site-packages\django\core\management\base.py", line 345, in execute
output = self.handle(*args, **options)
File "C:\Soft\python\venv\lib\site-packages\django\core\management\commands\dumpdata.py", line 200, in handle
object_count=object_count,
File "C:\Soft\python\venv\lib\site-packages\django\core\serializers\__init__.py", line 129, in serialize
s.serialize(queryset, **options)
File "C:\Soft\python\venv\lib\site-packages\django\core\serializers\base.py", line 88, in serialize
self.handle_field(obj, field)
File "C:\Soft\python\venv\lib\site-packages\django\core\serializers\python.py", line 54, in handle_field
self._current[field.name] = field.value_to_string(obj)
File "C:\Soft\python\venv\lib\site-packages\wagtail\wagtailcore\fields.py", line 123, in value_to_string
return self.get_prep_value(value)
File "C:\Soft\python\venv\lib\site-packages\wagtail\wagtailcore\fields.py", line 107, in get_prep_value
return json.dumps(self.stream_block.get_prep_value(value), cls=DjangoJSONEncoder)
File "C:\Soft\python\venv\lib\site-packages\wagtail\wagtailcore\blocks\stream_block.py", line 211, in get_prep_value
for child in value # child is a BoundBlock instance
File "C:\Soft\python\venv\lib\site-packages\wagtail\wagtailcore\blocks\stream_block.py", line 210, in <listcomp>
{'type': child.block.name, 'value': child.block.get_prep_value(child.value)}
File "C:\Python35-32\lib\_collections_abc.py", line 815, in __iter__
v = self[i]
File "C:\Soft\python\venv\lib\site-packages\wagtail\wagtailcore\blocks\stream_block.py", line 324, in __getitem__
value = child_block.to_python(raw_value['value'])
File "C:\Soft\python\venv\lib\site-packages\wagtail\wagtailcore\blocks\struct_block.py", line 131, in to_python
for name, child_block in self.child_blocks.items()
File "C:\Soft\python\venv\lib\site-packages\wagtail\wagtailcore\blocks\struct_block.py", line 131, in <listcomp>
for name, child_block in self.child_blocks.items()
TypeError: argument of type 'int' is not iterable
مرحبا soar ،
لا يمكنني إعادة إنتاج هذا عند تثبيت جديد ، باستخدام هذا الإجراء:
في سطر الأوامر:
wagtail start dumpdatatest
cd dumpdatatest
./manage.py migrate
./manage.py createsuperuser
تحرير home / Models.py:
from __future__ import absolute_import, unicode_literals
from django.db import models
from wagtail.wagtailcore.models import Page
from wagtail.wagtailcore import blocks
from wagtail.wagtailcore.fields import StreamField
from wagtail.wagtailimages.blocks import ImageChooserBlock
from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
class ImageBlock(blocks.StructBlock):
image = ImageChooserBlock()
description = blocks.CharBlock()
class Meta:
icon = 'image'
template = 'image.html'
class HomePage(Page):
body = StreamField([
('image', ImageBlock()),
])
content_panels = [
FieldPanel('title'),
StreamFieldPanel('body'),
]
في سطر الأوامر:
./manage.py makemigrations # (use '' as default)
./manage.py runserver
تسجيل الدخول إلى المسؤول ، وتحرير الصفحة الرئيسية ، وإضافة كتلة صورة ، ونشر
./manage.py dumpdata --traceback
ينتج هذا التفريغ كما هو متوقع.
أظن أن الخطأ يحدث لأن تعريف StreamField الخاص بك كان في الأصل يحتوي على ImageChooserBlock
عادي ، لكنك قمت بتغييره إلى تعريف StructBlock
الحالي. لا يؤدي تغيير تعريف StreamField إلى تحديث بيانات الصفحة الحالية تلقائيًا ، لذلك ستظل أي صفحات موجودة تحتوي على نوع بيانات غير صحيح فيها.
أنت على حق ، كان هذا خطأي. آسف على وقتك gasman
gasman إذن هل الحل الأسهل هو إعادة تسمية الحقل؟ نظرًا لأنه لا يتم تحديثه تلقائيًا أو أن هناك طريقة لتحديث أو إزالة القيم القديمة من الصفحات الموجودة عليها؟
التعليق الأكثر فائدة
مرحبا soar ،
لا يمكنني إعادة إنتاج هذا عند تثبيت جديد ، باستخدام هذا الإجراء:
في سطر الأوامر:
تحرير home / Models.py:
في سطر الأوامر:
تسجيل الدخول إلى المسؤول ، وتحرير الصفحة الرئيسية ، وإضافة كتلة صورة ، ونشر
./manage.py dumpdata --traceback
ينتج هذا التفريغ كما هو متوقع.
أظن أن الخطأ يحدث لأن تعريف StreamField الخاص بك كان في الأصل يحتوي على
ImageChooserBlock
عادي ، لكنك قمت بتغييره إلى تعريفStructBlock
الحالي. لا يؤدي تغيير تعريف StreamField إلى تحديث بيانات الصفحة الحالية تلقائيًا ، لذلك ستظل أي صفحات موجودة تحتوي على نوع بيانات غير صحيح فيها.