【问题标题】:Django ".widget.attrs.update" with NO effectDjango“.widget.attrs.update”没有效果
【发布时间】:2021-02-02 16:45:10
【问题描述】:

我有一个带有以下 init 方法的 ModelForm:

def __init__(self, *args, **kwargs):
    super(FragebogenForm, self).__init__(*args, **kwargs)
    self.fields['birth_date'].widget.attrs.update({'type': 'date'})

这不会改变输入标签的类型属性,虽然它应该according to the documentation (ctrl + f -> "或者如果该字段没有直接在表单上声明")。如果我将其更改为例如.widget.attrs.update({'placeholder': '12.12.1999'}) 有效,新的占位符出现在页面上。仅将类型设置为日期不起作用,但为什么呢?

【问题讨论】:

  • 您的模板是什么样的。它只是引用 {{ form }} 还是单独引用字段?

标签: django django-forms django-3.1


【解决方案1】:

widget的类型由.input_type属性决定,所以:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['birth_date'].widget.input_type = 'date'

然而,这通常不是一个好主意,因为小部件的其他项目不会正确更改。通常您在Meta 类中指定小部件:

class MyForm(forms.ModelForm):
    
    class Meta:
        model = Meta
        widgets = {
            'birth_date': forms.DateInput()
        }

但如果小部件不是DateInput,那么您模型中的字段birth_date 可能不是models.DateField,因此最好修复这个而不是解决它在小部件级别。

【讨论】:

  • 您的第一个代码块也是我在一段时间后想出的(但仍然不知道为什么您可以通过attrs.update 编辑除类型之外的所有其他 HTML 标记属性)。在构造函数中编辑字段不是常见的做法吗?我不知道表单字段的小部件属性还有其他规则。
【解决方案2】:

我刚刚发现了自己的错误。我没有将初始化程序或__init__ 放在类元函数之外。我的小部件都不能正常工作 ###确保初始化块在外面

    class ProfileForm(ModelForm):
            class Meta:
                model = Profile 
                fields = ['avatar','company']  
        
    
 def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['avatar'].widget.attrs.update({'class': 'form-control'})

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2018-05-21
    • 2018-07-28
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多