Есть ли способ выполнить валидацию связанных Orderable в InlinePanel в WagtailCMS? - PullRequest
0 голосов
/ 10 февраля 2019

Я использую Wagtail CMS и мне нужна некоторая проверка для моей Orderable модели.Мол, гарантируя, что не более одного поля заполнено.

Обычно я бы переопределил метод clean(self) для модели Django, но вызов super().clean() внутри этого метода возвращает None.Я все еще могу получить доступ к полям с self.field_name, а повышение ValidationError все еще не позволяет создать модель, но не показывает, какие поля вызвали ошибку для модели в интерфейсе администратора.

IЯ пытался переопределить метод clean, который останавливает фиксацию модели, но не отображает ошибки на интерфейсе

Я пытался следовать этой части руководства , но clean метод, который даже не вызывается для Orderable.

Это пример моего clean метода

def clean(self):
    super().clean()
    has_image =  self.image is not None
    has_video = self.video_url is not None

    if has_image == has_video:
        raise ValidationError('Either a video or an image must be set')

Я ожидаю, что ошибки проверки появятся в администратореинтерфейс.

1 Ответ

0 голосов
/ 22 июля 2019

Я копался в исходном коде трясогузки и думаю, что нашел способ доступа к элементам управления формы для заказа.

Допустим, у вас есть модель для страницы,

class TestPage(Page):

    testPageTitle = RichTextField(blank=True, max_length=250)

    content_panels = Page.content_panels + [
    FieldPanel('testPageTitle'),
    InlinePanel('test_page_field')
    ]

    base_form_class = TestPageForm

с некоторой заказываемой моделью, которая связана со страницей через связанное имя 'test_page_field',

class TestPageField(Orderable):
    page = ParentalKey(TestPage, on_delete=models.CASCADE, related_name='test_page_field')

    testPageFieldTitle = models.CharField(blank=True, max_length=250)

    panels = [
    FieldPanel('testPageFieldFieldTitle')
    ]

, тогда вы можете получить доступ к этому в чистом методе страницы через self.formsets['test_page_field'].forms, который представляет собой список объектов формы Django, где можно выполнять регулярные проверки и использовать метод .add_error().Соответствующий base_form_class будет выглядеть следующим образом:

class TestPageForm(WagtailAdminPageForm):

    def clean(self):
    cleaned_data = super().clean()

    #loop over linked orderables
    for form in self.formsets['test_page_field'].forms:

        #check first if form is valid, otherwise cleaned_data will not be accesible/set
        if form.is_valid():
            cleaned_form_data = form.clean()
            testPageFieldFieldTitle = cleaned_form_data.get('testPageFieldFieldTitle')

            #execute some validation condition, and raise the error if it fails
            if testPageFieldFieldTitle is None:
                form.add_error('testPageFieldFieldTitle', 'please dont leave me empty')

    return cleaned_data

Надеюсь, это поможет.

...