【问题标题】:How can I modify a widget's attributes in a ModelForm's __init__() method?如何在 ModelForm 的 __init__() 方法中修改小部件的属性?
【发布时间】:2010-10-18 17:58:47
【问题描述】:

我想以编程方式修改 Django ModelForm 的 init() 方法中字段的小部件属性。到目前为止,我已经尝试了以下

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['my_checkbox'].widget_attrs(forms.CheckboxInput(attrs={'onclick':'return false;'}))

很遗憾,这不起作用。有什么想法吗?

【问题讨论】:

    标签: django widget django-forms


    【解决方案1】:
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['my_checkbox'].widget.attrs['onclick'] = 'return false;'
    

    【讨论】:

    • 或者,更好的是attrs['onclick'] = 'return false'
    • 谢谢——这有效。知道“widget_attrs”是什么意思吗?
    • @Daneil,你能解释一下吗?
    • widget_attrs 是字段类上的一个方法,用于根据当前字段类返回应添加到小部件的属性,例如。 max_lengthCharFields。您不应该按照您尝试的方式覆盖它,因为有必要让该字段正常工作......
    【解决方案2】:

    Bernhard 的答案曾经适用于 1.7 及之前的版本,但我无法让它在 1.8 上运行。

    但这是可行的:

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['my_checkbox'].widget = forms.widgets.Checkbox(attrs={'onclick': 'return false;'})
    

    【讨论】:

      【解决方案3】:

      我在 Django 1.10 上遇到了与 James Lin 相同的问题,但通过更新 attrs 字典而不是分配新的小部件实例来解决这个问题。就我而言,我无法保证字典中存在属性键。

      def __init__(self, *args, **kwargs):
          super(MyForm, self).__init__(*args, **kwargs)
          self.fields['my_checkbox'].widget.attrs.update({'onclick': 'return false;'})
      

      【讨论】:

        【解决方案4】:

        我必须做同样的事情,但不一定在初始化时。在我的情况下,我必须设置一个特定的 id 才能使用我的 AJAX 函数。答案与上面的 kmctown 类似,但我没有使用 init,只是在表单类中创建了一个普通函数,如下所示:

        def type_attr(self, id_val):
            self.fields['type'].widget.attrs.update({'id':id_val})
        

        然后,在视图中:

        form=YourForm(request.POST or None)
        form.type_attr(id_val)
        

        这在我的情况下有效。

        【讨论】:

          猜你喜欢
          • 2011-04-10
          • 1970-01-01
          • 1970-01-01
          • 2019-09-12
          • 1970-01-01
          • 1970-01-01
          • 2017-12-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多