wagtail-localize icon indicating copy to clipboard operation
wagtail-localize copied to clipboard

Setting FK field to be translatable causes an error when trying to publish the translation

Open dinoperovic opened this issue 3 years ago • 0 comments

I have an inline model with a foreign key to another page. Setting that FK field to be “translatable” causes an error when trying to publish the translation:

Cannot assign "<Page: One Spain>": "HomePageWork.work" must be a "WorkEntry" instance.

It appears that it’s trying to set a “non-specific” page model.

Here’s the model:

class HomePageWork(TranslatableMixin, Orderable):
    home_page = ParentalKey(HomePage, on_delete=models.CASCADE, related_name="work")
    work = models.ForeignKey(WorkEntry, on_delete=models.CASCADE, related_name="+")

    override_translatable_fields = [
        TranslatableField("work"),
    ]

    panels = [
        PageChooserPanel("work"),
    ]

    class Meta(TranslatableMixin.Meta):
        verbose_name = "Selected work"
        verbose_name_plural = "Selected work"
        ordering = ["sort_order"]

    def __str__(self):
        return str(self.work)
Traceback:
Traceback (most recent call last):
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
  response = view_func(request, *args, **kwargs)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail/admin/urls/__init__.py", line 108, in wrapper
  return view_func(request, *args, **kwargs)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail/admin/auth.py", line 172, in decorated_view
  response = view_func(request, *args, **kwargs)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/django/views/generic/base.py", line 70, in view
  return self.dispatch(request, *args, **kwargs)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail/admin/views/pages/edit.py", line 202, in dispatch
  response = self.run_hook('before_edit_page', self.request, self.page)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail/admin/views/generic/hooks.py", line 16, in run_hook
  result = fn(*args, **kwargs)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail_localize/wagtail_hooks.py", line 148, in before_edit_page
  return edit_translation.edit_translation(request, translation, page)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail_localize/views/edit_translation.py", line 432, in edit_translation
  translation.save_target(user=request.user, publish=True)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail_localize/models.py", line 1131, in save_target
  self.source.create_or_update_translation(self.target_locale, user=user, publish=publish, fallback=True, copy_parent_pages=True)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail_localize/models.py", line 690, in create_or_update_translation
  ingest_segments(original, translation, self.locale, locale, segments)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail_localize/segments/ingest.py", line 288, in ingest_segments
  ingest_segments(
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/wagtail_localize/segments/ingest.py", line 266, in ingest_segments
  setattr(translated_obj, field_name, related_translated)
File "/Users/dino/Dev/projects/brightdock/RAA/api/.venv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 215, in __set__
  raise ValueError(
Exception Type: ValueError at /admin/pages/5/edit/
Exception Value: Cannot assign "<Page: One Spain>": "HomePageWork.work" must be a "WorkEntry" instance.

Fixed it by changing this line:

https://github.com/wagtail/wagtail-localize/blob/1fc5ad78ecbb3f4adc19bfa355e5a4dedaf37f61/wagtail_localize/segments/ingest.py#L266

to:

if issubclass(field.related_model, Page):
    related_translated = related_translated.specific
setattr(translated_obj, field_name, related_translated)

I assume there is a better way of doing it :)

dinoperovic avatar Jul 02 '21 07:07 dinoperovic