[英]How do I change the widget type of the DELETE field in a django formset
我正在使用can_delete = True的表单集。 我想将DELETE字段的小部件更改为隐藏的输入。 我似乎找不到解决此问题的好方法。 我试过的是:
将表单的小部件更改为HiddenInput和/或在表单定义中添加一个隐藏字段:
class MyForm(ModelForm):
DELETE = forms.BooleanField(widget=forms.HiddenInput)
class Meta:
model = MyModel
widgets = {'DELETE' : forms.HiddenInput}
通过更改表单集来执行上述操作
class MyFormSet(BaseModelFormSet):
def add_fields(self, form, index):
originalDeletion = None
if DELETION_FIELD_NAME in form.fields:
originalDeletion = form.fields[DELETION_FIELD_NAME]
super(MyFormSet, self).add_fields(form,index)
if originalDeletion is not None:
form.fields[DELETION_FIELD_NAME] = originalDeletion
如果同时执行这两项操作,则实际上会将字段更改为隐藏,但这似乎有点hack(有效地覆盖了通常的add_fields方法)。 你应该怎么做?
==编辑==
事实证明,对于表单框架而言,使用隐藏字段并不是很好。 您绝对应该使用复选框,并使用CSS将其隐藏。 如果要在Django中调整复选框的css,我仍然认为您必须如上所述更改add_fields方法,然后可以使用该方法更改小部件的css。
完成您所需的最短代码是:
class MyFormSet(BaseFormSet):
def add_fields(self, form, index):
super(MyFormSet, self).add_fields(form, index)
form.fields[DELETION_FIELD_NAME].widget = forms.HiddenInput()
不能将其视为黑客,因为在官方Django文档中已提及:
Django资料阅读:
如果输入的类型为“隐藏”,或者输入的类型为“ checkbox” 且显示为:none,则不会更改任何内容。
恕我直言,CSS中的优雅方式如下所示:
td.delete input { display: none; }
或在JavaScript中:
$('td.delete input[type=checkbox]').hide()
或者,在管理员中:
django.jQuery('td.delete input[type=checkbox]').hide()
这似乎是一个更好的方向,因为:
将self.can_delete
设置为False
解决了我的问题:
class MyFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
super(MyFormSet, self).__init__(*args, **kwargs)
self.can_delete = False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.