wagtail-localize
wagtail-localize copied to clipboard
Setting FK field to be translatable causes an error when trying to publish the translation
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 :)