【问题标题】:How do I change the widget type of the DELETE field in a django formset如何更改 django formset 中 DELETE 字段的小部件类型
【发布时间】:2012-03-11 21:05:19
【问题描述】:

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

【问题讨论】:

  • 为什么它 必须 是 type=hidden ?其他的隐藏方式不是也很好吗?

标签: python django


【解决方案1】:

完成你需要的最短代码是:

class MyFormSet(BaseFormSet):
    def add_fields(self, form, index):
        super(MyFormSet, self).add_fields(form, index)
        form.fields[DELETION_FIELD_NAME].widget = forms.HiddenInput()

它不能被认为是 hack,因为它在官方 Django 文档中有所提及:

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

要阅读的 Django 源代码:

【讨论】:

    【解决方案2】:

    如果您的输入是 type=hidden 或 type=checkbox 并且 display: 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 hacks

    【讨论】:

    • 啊 - 所以你把它隐藏在 javascript/css 中。这就说得通了。仍然看起来很奇怪,没有办法直接在 django 中执行此操作 - 我想相当于将一个 css 类添加到隐藏它的小部件。不过,您似乎无法这样做,因为它不允许您覆盖 DELETE 小部件。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2012-08-16
      • 2010-11-06
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多