J'ai deux modèles dans une application wagtail, Je pensais pouvoir supprimer Cependant, je rencontre des erreurs lorsque je fais cela: 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! PageType
et NewPageType
, et je dois remplacer PageType
par NewPageType code >.
PageType
de mes models.py
, puis exécuter une migration pour le supprimer, puis renommer NewPageType
à PageType
et lancez une deuxième migration. [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
3 Réponses :
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 .
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.
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.