Я пытаюсь интегрировать трясогузку в существующий проект django, но получаю указанную выше ошибку при добавлении дочерней страницы.
В моих настройках я следовал инструкциям:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'whitenoise.runserver_nostatic',
'home',
'news',
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail',
'modelcluster',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django_permissions_policy.PermissionsPolicyMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
]
адреса моего проекта:
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static
from django.urls import reverse
from wagtail.admin import urls as wagtailadmin_urls
from wagtail import urls as wagtail_urls
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
path('', include('home.urls')),
path('news/', include('news.urls')),
path('cms/', include(wagtailadmin_urls)),
path('documents/', include(wagtaildocs_urls)),
path('news/', include(wagtail_urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
мои новостные ссылки:
from django.urls import path
from .views import news_article_detail
urlpatterns = [
path('news/<int:pk>/', news_article_detail, name='news_article_detail'),
]
в моем представлении новостей:
from django.shortcuts import render
from .models import NewsArticlePage
#import pdb; pdb.set_trace()
def news_article_detail(request, pk):
news_article = NewsArticlePage.objects.get(pk=pk)
return render(request, 'news/news_page.html', {'news_article': news_article})
и моя модель:
from django.db import models
from wagtail.core.models import Page
from wagtail.admin.edit_handlers import FieldPanel
from wagtail.core.fields import RichTextField
class NewsArticlePage(Page):
article_body = RichTextField(blank=True)
content_panels = Page.content_panels + [
FieldPanel('article_body'),
]
template = "news/news_page.html"
и в моем шаблоне:
{% extends "base.html" %}
{% block content %}
<h1>{{ page.title }}</h1>
{{ page.article_body|richtext }}
{% endblock %}
Я также добавил корневую страницу, убедился, что URL-адреса указывают на правильное место, выполнил миграцию и миграцию, но все равно получаю ту же ошибку. Итак, когда я перехожу к localhost/cms в бэкэнде, у меня настроена страница, когда я иду, чтобы добавить дочернюю страницу, я получаю сообщение об ошибке, я пробовал python manage.py fixtree, но я все еще получаю ошибку, вот стек след:
Окружающая среда:
Метод запроса: POST URL-адрес запроса: http://127.0.0.1:7000/cms/pages/add/news/newsarticlepage/2/
Django Version: 3.2.4
Python Version: 3.11.1
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'whitenoise.runserver_nostatic',
'accounts',
'compressor',
'corsheaders',
'home',
'news',
'taggit',
'widget_tweaks',
'sass_processor',
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail',
'modelcluster']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django_permissions_policy.PermissionsPolicyMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware']
Traceback (most recent call last):
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\wagtail\admin\urls\__init__.py", line 170, in wrapper
return view_func(request, *args, **kwargs)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\wagtail\admin\auth.py", line 182, in decorated_view
response = view_func(request, *args, **kwargs)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\django\views\generic\base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\wagtail\admin\views\pages\create.py", line 119, in dispatch
return super().dispatch(request)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\django\views\generic\base.py", line 98, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\wagtail\admin\views\pages\create.py", line 132, in post
return self.form_valid(self.form)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\wagtail\admin\views\pages\create.py", line 148, in form_valid
return self.save_action()
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\wagtail\admin\views\pages\create.py", line 170, in save_action
self.parent_page.add_child(instance=self.page)
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\treebeard\mp_tree.py", line 1089, in add_child
return MP_AddChildHandler(self, **kwargs).process()
File "C:\Users\sesa301575\sites\Django.Azure\venv\Lib\site-packages\treebeard\mp_tree.py", line 383, in process
newobj.path = self.node.get_last_child()._inc_path()
Exception Type: AttributeError at /cms/pages/add/news/newsarticlepage/2/
Exception Value: 'NoneType' object has no attribute '_inc_path'
Кроме того, создание явного представления для ваших страниц с трясогузками необычно. Как правило, используется механизм обслуживания страниц Wagtail, что в вашем случае означает, что созданные вами страницы будут общедоступны по адресу example.com/news/<page_slug>.
'NoneType' object has no attribute '_inc_path'
обычно указывает, что внутренние поля (path
, depth
, numchild
), определенные библиотекой django-treebeard для отслеживания количества дочерних элементов в дереве страниц, стали несогласованными. Неясно, что могло вызвать это здесь, но запуск ./manage.py fixtree
должен это исправить.
Спасибо, газовщик, я попробовал ваше предложение, но все равно получаю ту же ошибку, я отредактировал свой вопрос с трассировкой стека.
Как вы и предположили, в моих URL-адресах возникла путаница, у меня были оба пути («новости /», include («news.urls»)), и путь («новости /», include (wagtail_urls)), большое спасибо @газман
В моих проектах мне обычно нужно запускать ./manage.py fixtree --full
для решения проблем. Если это все еще не работает, на MP_Node есть метод find_problems
, но нет команды управления для доступа к нему; вам нужно будет погрузиться в оболочку django, чтобы использовать его.
Не могли бы вы подробнее описать, что вы делаете, когда получаете это сообщение об ошибке? И включить фактическую трассировку стека?