Как использовать страницы приложения Wagtail для создания динамических страниц из модели django?

У меня есть модель данных django для нескольких мест, из которых мне нужно генерировать страницы в трясогузке. Как и в блоге, мне нужна страница со списком и страницы с подробностями.

Я следил за этой документацией: https://wagtail-app-pages.readthedocs.io/en/latest/index.html

models.py

from django.db import models

from wagtail.core.models import Page
from wagtail_app_pages.models import AppPageMixin

from . import misc_options


class Feature(models.Model):
    feature = models.CharField(max_length=50)
    description = models.CharField(max_length=300)

    class Meta:
        ordering = ['feature']
        verbose_name = "Feature"
        verbose_name_plural = "Features"

    def __str__(self):
        return self.feature


class Location(models.Model):

    template = 'locations/locations_list.html'

    name = models.CharField(max_length=30, null=True, blank=False)
    address = models.CharField(max_length=60, null=True, blank=False)
    city = models.CharField(max_length=25)
    state = models.CharField(
        max_length=2, choices=misc_options.STATES, null=True, blank=False)
    zipcode = models.CharField(max_length=5, null=True, blank=False)
    lat = models.CharField(max_length=50, null=True, blank=False)
    lon = models.CharField(max_length=50, null=True, blank=False)
    phone = models.CharField(max_length=10, null=True, blank=False)
    email = models.CharField(max_length=40, null=True, blank=False)
    places_id = models.CharField(max_length=100, null=True, blank=True)
    facebook_url = models.CharField(max_length=100, null=True, blank=True)
    google_url = models.CharField(max_length=100, null=True, blank=True)
    entity = models.CharField(max_length=10, null=True, blank=True)
    truck_url = models.CharField(max_length=100, null=True, blank=True)
    trailer_url = models.CharField(max_length=100, null=True, blank=True)
    supplies_url = models.CharField(max_length=100, null=True, blank=True)
    features = models.ManyToManyField(Feature)

    class Meta:  # noqa
        ordering = ['name']
        verbose_name = "Location"
        verbose_name_plural = "Locations"

    def __str__(self):
        return self.name


class LocationPage(AppPageMixin, Page):
    template = 'locations/locations_list.html'
    url_config = 'location.urls'

    class Meta:  # noqa
        verbose_name = "Locations List"
        verbose_name_plural = "Locations Lists"

urls.py

from django.urls import path

from .views import LocationDetailView, LocationListView

urlpatterns = [
    path(r"^locations/?$", LocationListView.as_view(), name="location_list"),
    path(r"^location/<int:pk>/?$",
         LocationDetailView.as_view(), name="location"),
]

views.py

from django.shortcuts import render
from django.views.generic import DetailView, ListView
from .models import Location
from .google import getGoogleReviews
from .wss import getWSSUnits


class LocationDetailView(DetailView):

    model = Location

    context_object_name = "location"
    queryset = Location.objects.all()
    template_name = "locations/location_details.html"

    def get(self, request, **kwargs):
        self.object = self.get_object()
        places_id = self.object.places_id
        entity = self.object.entity

        reviews = getGoogleReviews(places_id)
        units = getWSSUnits(entity)
        context = self.get_context_data(
            object=self.object, reviews=reviews, units=units)

        return self.render_to_response(context)


class LocationListView(ListView):

    model = Location

местоположения /location_list.html

{% extends 'base.html' %}
{% load app_pages_tags %}

{% block content %}
{% for item in location_list %}
{{item.name}}
{% endfor %}
{{ location_list }}
This is the locations list
{% endblock %}

У меня есть возможность выбрать страницу со списком локаций в трясогузке. Я создаю страницу, единственное доступное поле - это поле внутреннего имени, что правильно.

Когда я перехожу к URL-адресу, блок содержимого остается пустым. Когда я пытаюсь перейти в какое-то место, например "местоположение /1", я получаю 404.

Я думаю, что происходит то, что моя модель игнорируется, приложения страницы трясогузки игнорируются, а список местоположений обрабатывается как модель пустой страницы трясогузки. Я не понимаю, что делаю не так. В консоли ошибок нет.

2 ответа

Решение

Извините, я обнаружил это немного поздно, но я постараюсь взвесить все как автор.

Я просто попытался воспроизвести проблему локально. Мне пришлось внести несколько изменений в код, и я не уверен, какие версии django и wagtail вы используете, но мне удалось получить базовую настройку, работающую на основе вашего кода.

Он очень быстро взломан, но не стесняйтесь взглянуть на это, это репо, включающее базу данных sqlite с контентом, вы можете войти в систему с помощью admin/admin.

Честно говоря, я немного смущен тем, что было непонятным в том, как работает конфигурация URL, поскольку она довольно точно следует принципам конфигов URL-адресов django. В вашем примере, похоже, используется странное сочетание синтаксиса, смешивая регулярное выражение и синтаксис, не основанный на регулярных выражениях. Я немного изменил это в своем примере, показывая как шаблон регулярного выражения, так и шаблон без регулярного выражения (django 3.0).

Пожалуйста, дайте мне знать, если это проясняет ситуацию, и я буду рад любым предложениям относительно того, как я могу улучшить документацию.

Примеры в документации не демонстрируют должным образом, как URL-адреса работают с этой библиотекой.

Трясогузка устанавливает URL-адрес страницы с листингом. Я создал страницу, используя шаблон LocationPage, назвал ее "Locations", и она доступна по адресу "/locations". Мой url.conf был неправильным. Я установил страницу со списком на r'^location/?$'.

  1. Страницы приложения трясогузки по какой-то причине не любят регулярное выражение. Я должен зеленый, чтобы понять почему, но это нет.

  2. то, что я выбираю в качестве слага LocationListView, нужно добавить к пути URL-адреса страницы трясогузки. удалив регулярное выражение, если я использую "location /" в своем URL-адресе conf, моя страница будет доступна по адресу "location /locations/".

Я думаю, что в документации предполагается, что URL-адрес вашей страницы трясогузки будет корневым (что не имеет смысла), поэтому страница со списком блогов будет доступна в корневом каталоге / статьях. но, насколько мне известно, это приведет к тому, что ваш корневой URL-адрес будет заявлен, но не будет использоваться, поэтому у вас не будет домашней страницы. Очень запутанно.

Другие вопросы по тегам