2
votes

Comment renommer correctement un modèle de page de bergeronnette

J'ai deux modèles dans une application wagtail, PageType et NewPageType , et je dois remplacer PageType par NewPageType code >.

Je pensais pouvoir supprimer PageType de mes models.py , puis exécuter une migration pour le supprimer, puis renommer NewPageType à PageType et lancez une deuxième migration.

Cependant, je rencontre des erreurs lorsque je fais cela:

[2019-01-22 23:20:26,344] [ERROR] Internal Server Error: /cms/
Traceback (most recent call last):
  File "/.../python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/.../python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  [...snip...]
  File "/.../python3.6/site-packages/django/db/models/query.py", line 1121, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/.../python3.6/site-packages/wagtail/core/query.py", line 397, in specific_iterator
    yield pages_by_type[content_type][pk]
KeyError: 278

Il semble que quelque chose n'ait pas été mis à jour automatiquement par la gestion de migration intégrée de Django. Je ne pouvais pas dire quelles étapes je manquais ici, j'aimerais donc obtenir de l'aide. Merci!


0 commentaires

3 Réponses :


4
votes

C'est parce que les pages Wagtail utilisent Multi-table l'héritage et une partie de vos pages PageType supprimées sont toujours là.

Jetons un coup d'œil à une nouvelle installation de Wagtail (c'est-à-dire wagtail start mysite ) qui est livré avec un modèle home.HomePage et crée une HomePage par défaut. Nous pouvons jeter un œil à la base de données et confirmer qu'il y a bien une entrée dans la base de données:

sqlite> SELECT id, path, title, slug, url_path, content_type_id FROM wagtailcore_page;
id|path    |title|slug|url_path|content_type_id
1 |0001    |Root |root|/       |1
3 |00010001|Home |home|/home/  |2

Cependant elle est plutôt vide. Il n'y a pas de titre, pas de chemin, rien d'autre qu'un page_ptr_id . En effet, la HomePage hérite du modèle Page qui n'est pas abstrait. Par conséquent, il existe également une table de base de données pour ce modèle de page (c'est ainsi que L'héritage multi-table fonctionne avec Django). Jetons un coup d'œil au tableau correspondant (en supprimant volontairement certaines colonnes):

sqlite> SELECT * FROM home_homepage;
page_ptr_id
3

Le voici!

De même, dans votre cas, il y a le wagtailcore_page , les tables myapp_pagetype et myapp_newpagetype . En supprimant le modèle PageType , django a créé une migration qui a ensuite supprimé le myapp_pagetype mais a laissé l'entrée dans la table wagtailcore_page . Par conséquent, lorsque vous chargez l'interface d'administration, Wagtail essaie de charger la page n ° 3 mais n'y parvient pas.

Pour cette raison, avant de supprimer un modèle de page, vous devez d'abord supprimer toutes les pages. Vous pouvez y parvenir en ajoutant un Étape RunPython de votre migration.

Il vous restera cependant à renommer votre deuxième modèle, ce qui peut être difficile avec Django, mais si vous avez de la chance, renommez-le dans vos modèles .py et l'exécution de makemigrations pourraient suffire à Django pour détecter qu'il doit renommer le modèle. Sinon, ou si vous avez des relations qui doivent être renommées, cela pourrait être plus impliqué, voir 1 et 2 .


0 commentaires

1
votes

Pour récupérer et charger à nouveau admin, procédez comme suit:

Supprimez la référence:

django-admin dbshell
DELETE FROM wagtailcore_page WHERE id=278;

Puis supprimez la page.

import django
django.setup()
from wagtail.core.models import PageRevision
PageRevision.objects.filter(page_id= 278).delete()
exit()

J'espère que cela vous aidera.


0 commentaires

0
votes

Je suis nouveau sur wagtail, mais je n'ai eu aucun problème à renommer le modèle et le modèle de corrélation, puis à exécuter

python manage.py makemigrations
python manage.py migrate

Cela étant dit, je ne réutilisais pas un ancien nom comme OP. Je pourrais recommander à quiconque ayant ce problème de trouver un nouveau nom pour le modèle et d'en faire un descriptif.


0 commentaires