Класс Media в наборе форм Django

У меня есть форма с именем SpecificDateForm. Кроме того, у меня есть набор форм с именем SpecificDateFormset, который создается с помощью inlineformset_factory от Django. Этот набор форм использует HiddenDeleteInputFormset, пользовательский набор форм, который, как следует из названия, скрывает флажок delete.

from django import forms

class SpecificDateForm(forms.ModelForm):
    class Meta:
        model = SpecificDate
        fields = ['date',]
        labels = {
            'date': 'Datum',
        }
        widgets = {
            'date': DatePickerInput(),
       }
        help_texts = {
            'date': 'fix vordefinierter Termin',
        }


class HiddenDeleteInputFormSet(forms.BaseInlineFormSet):
    def add_fields(self, form, index):
        super().add_fields(form, index)
        if 'DELETE' in form.fields:
            form.fields['DELETE'].widget = forms.HiddenInput()


SpecificDateFormset = forms.inlineformset_factory(
    Directive, SpecificDate,
    form=SpecificDateForm,
    formset=HiddenDeleteInputFormSet,
    extra=1,
    can_delete=True,
    localized_fields=['date']
)

Недавно я узнал, что с помощью class Media можно внедрить пользовательский javascript, который загружается вместе с формой. Работает ли это с наборами форм? Я не могу заставить его работать. Я пробовал class Media в разных местах кода, но мой пользовательский javascript никогда не появляется в теге {{ my_formset.media }}.

Итак, мой вопрос: где мне определить class Media? Или это просто невозможно с помощью наборов форм?

Да, вы определенно можете использовать класс Media с наборами форм в Django. Атрибут class Media позволяет вам указать JavaScript и CSS файлы, которые необходимы для ваших форм или наборов форм. Эти файлы затем автоматически включаются при рендеринге формы или набора форм в шаблоне с помощью шаблонных тегов {{ form.media }} или {{ formset.media }}.

Чтобы использовать класс Media в формах SpecificDateForm и HiddenDeleteInputFormSet, вам просто нужно определить его в каждом классе формы или набора форм. Вот как это можно сделать:

from django import forms

class SpecificDateForm(forms.ModelForm):
    class Meta:
        model = SpecificDate
        fields = ['date']
        labels = {
            'date': 'Datum',
        }
        widgets = {
            'date': DatePickerInput(),
       }
        help_texts = {
            'date': 'fix vordefinierter Termin',
        }

    class Media:
        js = ('path/to/your/custom_script.js',)


class HiddenDeleteInputFormSet(forms.BaseInlineFormSet):
    def add_fields(self, form, index):
        super().add_fields(form, index)
        if 'DELETE' in form.fields:
            form.fields['DELETE'].widget = forms.HiddenInput()

    class Media:
        js = ('path/to/your/custom_script.js',)


SpecificDateFormset = forms.inlineformset_factory(
    Directive, SpecificDate,
    form=SpecificDateForm,
    formset=HiddenDeleteInputFormSet,
    extra=1,
    can_delete=True,
    localized_fields=['date']
)

'path/to/your/custom_script.js' с фактическим путем к вашему файлу JavaScript.

Определив класс Media в каждом классе формы или набора форм, указанный JavaScript-файл будет включен при рендеринге формы или набора форм в вашем шаблоне с помощью {{ my_form.media }} или {{ my_formset.media }} соответственно. Убедитесь, что вы правильно отображаете {{ my_formset.media }} в своем шаблоне, чтобы включить файлы JavaScript, определенные в классе Media.

Вернуться на верх