如何更改Django表单中DELETE字段的小部件类型

2024-06-16 14:14:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个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

如果我同时执行这两个操作,它确实会将字段更改为hidden,但这看起来有点麻烦(实际上覆盖了通常的add_fields方法)。你该怎么做?

==编辑==

结果发现,无论如何,使用隐藏字段对表单框架都不是很好。你绝对应该使用一个复选框并用css隐藏它。如果您想在Django中调整复选框的css,我仍然认为您必须如上所述更改add_fields方法,这样您就可以更改小部件的css。


Tags: nameformadd表单fieldfields部件forms
3条回答

self.can_delete设置为False解决了我的问题:

class MyFormSet(BaseFormSet): 
    def __init__(self, *args, **kwargs): 
        super(MyFormSet, self).__init__(*args, **kwargs) 
        self.can_delete = False 

完成所需任务的最短代码是:

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的官方文档中提到过:

https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#adding-additional-fields-to-a-formset

Django来源如下:

如果输入为type=hidden,或者输入为type=checkboxdisplay:none,则不会更改任何内容。

在CSS中优雅的方式是这样的:

td.delete input { display: none; }

或者在JavaScript中:

$('td.delete input[type=checkbox]').hide()

或者,在管理员中:

django.jQuery('td.delete input[type=checkbox]').hide()

这似乎是一个更好的方向,因为:

  1. 它不会更改JavaScript代码
  2. 这是一行代码,而不是很多Python黑客

相关问题 更多 >