Django 表单集中的媒体类

问题描述 投票:0回答:1

我有一个名为

SpecificDateForm
的表格。此外,我有一个名为
SpecificDateFormset
的表单集,它是使用 Django 的
inlineformset_factory
创建的。此表单集使用
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
?或者对于表单集来说根本不可能?

django django-forms django-templates
1个回答
0
投票

是的,您绝对可以在 Django 中将 Media 类与表单集一起使用。 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 类,当您分别使用 {{ my_form.media }} 或 {{ my_formset.media }} 在模板中渲染表单或表单集时,将包含指定的 JavaScript 文件。确保您在模板中正确渲染 {{ my_formset.media }} 以包含 Media 类中定义的 JavaScript 文件。

© www.soinside.com 2019 - 2024. All rights reserved.