wagtail-generi c -виджет выбора (NoReverseMatch) - PullRequest
0 голосов
/ 28 марта 2020

У меня возникли проблемы с выяснением того, как реализовать wagtail-generi c -переключатель. Моя цель довольно проста. У меня есть много данных, которые не являются иерархическими, поэтому не имеет смысла создавать данные в виде страниц. Wagtail Model Admin - идеальное решение. Однако мне нужно иметь возможность перекрестной ссылки на данные между моделями, и в идеале было бы идеально иметь панель выбора, очень похожую на PageChooserPanel или SnippetChooserPanel, при выборе данных. Однако в трясогузке нет встроенной модели. Я попробовал многие из сторонних приложений, которые пытаются выполнить sh, но они не работают с более новыми версиями трясогузки или с python 3. Наконец-то я наткнулся на wagtail-generi c -переход, и похоже, что идеальное гибкое решение, которое позволит мне создать селектор типа snippetChooserPanel для подключения модели, в котором я нуждаюсь.

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

https://github.com/wagtail/wagtail-generic-chooser#chooser на основе модели виджетов

У меня есть модель события, ссылающаяся на модель категории события. И модель категории события, и модель события настроены как элементы modelAdmin.

Я установил wagtail-generi c -chooser и добавил его в мои установленные приложения.

Мой код

Categories.widget.py

from django.contrib.admin.utils import quote
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _

from generic_chooser.widgets import AdminChooser

from categories.models import CategoryEventCollection

class EventChooser(AdminChooser):
    choose_one_text = _('Choose a Event')
    choose_another_text = _('Choose another Event')
    link_to_chosen_text = _('Edit this Event')
    model = CategoryEventCollection

    #question???
    choose_modal_url_name = 'event_chooser:choose'

def get_edit_item_url(self, item):

    #question???
    return reverse('wagtailsnippets:edit', args=('categories', 'CategoryEventCollection', quote(item.pk)))

Использование в модели событий events.models.py

from django.db import models
from wagtail.admin.edit_handlers import MultiFieldPanel, FieldPanel, PageChooserPanel
from wagtail.core.fields import RichTextField

from wagtail.images.edit_handlers import ImageChooserPanel
from modelcluster.models import ClusterableModel
from categories.widgets import EventChooser


class EventOverview(ClusterableModel):

    template = 'events/event_overview_page'

    collection = models.ForeignKey(
        "categories.CategoryEventCollection",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+"
    )
    event_title = models.CharField(max_length=120, blank=True, null=True)
    event_descriptor = models.TextField(blank=True, null=True)

    panels = [

        FieldPanel("collection", widget=EventChooser),
        FieldPanel("event_title"),
        FieldPanel("event_descriptor"),

    ]


    class Meta:
        verbose_name = "Event Overview"
        verbose_name_plural = "Event Overviews"

В виджете. py-файл, откуда берется значение «choose_modal_url_name»? Я переименовал его из people_chooser, как в приведенном выше примере с документами, в тот, который имел отношение к моему классу, но, похоже, он вызывает ошибку. Нужно ли где-то регистрировать это значение? Нужно ли регистрировать виджет? Или это значение откуда-то указано c. В настоящее время выдает ошибку:

NoReverseMatch в / admin / events / eventoverview / edit / 1 / 'event_chooser' не является зарегистрированным пространством имен

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

def get_edit_item_url(self, item):

    #question???
    return reverse('wagtailsnippets:edit', args=('categories', 'CategoryEventCollection', quote(item.pk)))

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

1 Ответ

0 голосов
/ 29 марта 2020

Для всех, кто пытается заставить это работать, у кого могут быть проблемы.

Шаг 1. Настройте представление выбора в views.py,

Шаг 2. Зарегистрируйте набор в wagtail_hooks.py,

Шаг 3. Создайте класс AdminChooser который ссылается на зарегистрированный набор по имени, вы дали его в функции возврата.

Шаг 4. импортируйте и используйте в качестве виджета на нужной вам FieldPanel.

...