Wagtail: تم كسر أمر تفريغ البيانات لـ StructBlock

تم إنشاؤها على ١٤ يناير ٢٠١٧  ·  3تعليقات  ·  مصدر: wagtail/wagtail

ملخص القضية

عند استخدام 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

تفاصيل تقنية

  • إصدار Python: Python 3.5.1
  • إصدار Django: Django (1.10.4)
  • نسخة الذعرة: الذعرة (1.8)

التعليق الأكثر فائدة

مرحبا 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 إلى تحديث بيانات الصفحة الحالية تلقائيًا ، لذلك ستظل أي صفحات موجودة تحتوي على نوع بيانات غير صحيح فيها.

ال 3 كومينتر

مرحبا 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 إذن هل الحل الأسهل هو إعادة تسمية الحقل؟ نظرًا لأنه لا يتم تحديثه تلقائيًا أو أن هناك طريقة لتحديث أو إزالة القيم القديمة من الصفحات الموجودة عليها؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات