是否可以在运行时动态更改表单窗口小部件的属性

时间:2016-05-30 21:42:55

标签: django forms widget

我目前有一个看起来像这样的对象

class StudentDetails(forms.Form):
    school_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'readonly': 'readonly'}))
    student_name= forms.CharField(required=True)
    student_user_name = forms.CharField(required=True)

现在,这些字段在呈现之前已在视图中预先准备

 return render(request, 'manageStudent.html',
                  {'form': StudentDetails(
                      initial={
                          'school_name': rslt[0][1],
                          'student_name': rslt[0][2],
                          'student_user_name': rslt[0][3]
                      })})

我的问题是,是否可以禁用student_user_name字段?我想将该字段表单启用为禁用?

2 个答案:

答案 0 :(得分:0)

您可以通过将字段的disabled参数设置为True来禁用它。

此处提供更多信息:https://docs.djangoproject.com/en/1.9/ref/forms/fields/#disabled

或者当您在网页上进行更改时,您可以添加一个复选框来控制小部件的行为,如下所示:

在模板中,您将拥有input的{​​{1}},因此您只需在表单中添加复选框按钮

student_user_name

在JavaScript文件中

<!-- Input of the 'student_user_name' will be already there if you use {{ form }}-->
<!-- <input type="text" name="student_user_name" />-->
<input type="checkbox" id="checkbox"/>

答案 1 :(得分:0)

首先,一般来说,在表单中使用禁用/只读字段并不是一个好主意,尤其是如果您真的不希望用户弄乱这些字段的值。

最安全的选择是有条件地删除表格 init 中的表单字段,然后将数据从视图本身传递到模板中以供打印(如果您愿意)。

如果您确实希望继续进行,请确保在视图POST处理中完全不依赖此表单字段。使用您在视图中已知的字段值应该是什么。

另请注意,禁用和只读表单字段之间存在重要区别。 Readonly会将值传递给POST数据,而禁用则不会。为什么这有关系 ? (因为你无论如何都不会使用这个值,正如我们所说的那样)。

确实如此,原因有两个:

(1)如果表单验证由于某种原因失败,那么无论你打算在禁用字段中显示什么都将消失,因为从POST返回将不会捕获该字段值。

(2)如果表格字段是&#34;必需&#34;就像你的情况一样,它会给你那个字段的表单验证错误,因为该值不会保留在POST数据中。

要避免这种情况,您可以尝试在隐藏的表单字段中捕获值,并使用javascript / jquery将值放入字段中。以下是一个例子:

def __init__(self, *args, **kwargs):
    super(StudentDetails, self).__init__(*args, **kwargs)
    if 'initial' in kwargs:
        _student_user_name = str(kwargs.get('initial').get('student_user_name', None))
        if _student_user_name: 
            self.fields['student_user_name'].widget.attrs['disabled'] = True
            self.fields['student_user_name'].required = False
            self.fields['hidden_student_user_name'] = forms.CharField(widget=forms.HiddenInput())
            self.fields['hidden_student_user_name'].initial = _student_user_name

请记住,即使我们将student_user_name存储在隐藏表单字段中,隐藏的表单字段也可能被篡改。因此,请勿在视图中使用隐藏值进行任何实际存储,但仅限于重新填充失败的表单字段值的失败提交表单显示,仅用于装饰目的。

因此,即使禁用的表单字段值将消失(这就是为什么我们以隐藏的形式保存它),您确保在表单提交失败期间仍会显示您为学生用户名发送的初始值场):

在显示表单的模板页面中,将这段javascript代码放在:

<script type="text/javascript">
$(document).ready(function() {
      if ( $('input[name=hidden_student_user_name]').val() ) {
         var hidden_student_user_name = $('input[name=hidden_student_user_name]').val()
         $('input[name=student_user_name]').prop('disabled', false)
         $('input[name=student_user_name]').val(hidden_student_user_name)
         $('input[name=student_user_name]').prop('disabled', true)
      }
});
</script>