【问题标题】:Formset Factory Make Fields RequiredFormset Factory 必填字段
【发布时间】:2020-03-17 17:54:21
【问题描述】:

我在 Django 中使用modelformset_factory 让用户填写未知数量的字段。

我已经填写了必填字段,但是在 HTML 渲染中,Django 没有将 required 添加到 HTML 元素中,在网上查看这似乎是一个常见问题,但我没有看到任何适用于我想要的有效答案我觉得这应该很简单。

如何让 Django 将所需的标签添加到 Formset 的适当 HTML 元素中?

class ItemForm(forms.ModelForm):
    class Media:
        js = (formset_js_path,)

    class Meta:
        model = PurchaseOrderItems
        fields = ['name', 'vendor', 'quantity', 'price', 'description']
        labels = {
            'name': 'Item',
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.fields['description'] .widget.attrs['required'] = 'required'
        self.empty_permitted = False

        self.fields['description'] = forms.CharField(
            required=False,
            label='Description',
        )

    def clean(self):
        """

        :return:
        """
        cleaned_data = super().clean()
        # print(cleaned_data)



ItemFormSet = modelformset_factory(
    PurchaseOrderItems,
    form=ItemForm,
    extra=0,
    min_num=1,
    validate_min=True,
    can_delete=True,
)

这是为 name 字段呈现的 HTML,没有 required,但在我的模型中它肯定是,所以如果提交此表单,我会因为空值而出现 DB 错误:

<input type="text" name="form-0-name" maxlength="150" class="form-control" id="id_form-0-name">

【问题讨论】:

    标签: django python-3.x formset


    【解决方案1】:

    根据release notes

    必填表单字段现在具有 required HTML 属性。设置新的 Form.use_required_attribute 属性为 False 以禁用它。这 表单集的表单中不包含 required 属性,因为 添加和删​​除时浏览器验证可能不正确 表单集。

    因此,如果您想禁用,从您的角度来看,您必须以这种方式提交表单。这将影响您的所有字段。

    form = ItemForm(use_required_attribute=False)
    

    但是,如果您只想影响某些内容,则必须执行上一步并在表单中添加此内容

      def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['name'].widget.attrs.update({'required': ''})
        self.fields['vendor'].widget.attrs.update({'required': ''})
        self.fields['quantity'].widget.attrs.update({'required': ''})
        self.fields['price'].widget.attrs.update({'required': ''})
        self.fields['description'].widget.attrs.update({'required': 'False'})
    

    另一方面,我看到您没有在表单中使用小部件,您也应该使用它们来使其工作。

      widgets = {
            'name': forms.TextInput(),
            'vendor': forms.TextInput(),
            'quantity': forms.TextInput(),
            'price': forms.TextInput(),
            'description': forms.TextInput(),
        }
    

    我把所有的字段都作为TextInput,但是这里根据数据的类型查找指示的内容Field types

    【讨论】:

    • 嗯,您的回答提供了说明我所问问题的文档参考,所以谢谢,但我认为您误解了我的问题,所以这无济于事。我希望必填字段默认具有 required 属性。我绝不希望它们禁用任何形状或形式,因为我无法强制输入数据。正如您在我已经阅读的文档中发布的那样,Formsets 不提供此功能。在我已经实现的完整前端解决方案之外,我正在尝试找到一种 Django 方法来做到这一点。
    • 如果你希望你的所有字段默认都具有 required 属性,请将 use_required_attribute 设置为 True
    • 如果你这样做没关系,无论use_required_attribute 的值如何,表单集字段仍会在没有必需属性的情况下呈现...正如您从文档中指出的那样。
    猜你喜欢
    • 2015-02-11
    • 2017-10-24
    • 2021-06-25
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多