在 django 3.0 中将复选框选项显示为“已禁用”。模型形式

Posted

技术标签:

【中文标题】在 django 3.0 中将复选框选项显示为“已禁用”。模型形式【英文标题】:Display a checkbox choice as "disabled" in django 3.0. ModelForm 【发布时间】:2020-08-12 08:53:09 【问题描述】:

我一直在寻找类似的问题,但我还没有找到针对我的具体问题的解决方案。我的目标是显示这样的复选框。

Where only the signed in (authenticated) user has the ability to select/deselect the checkbox corresponding to his profile. In this case, mindspace is authenticated

我通过尝试这个解决方案达到了这一点:But as one of the comments suggest the create_option method doesn't get called through the CheckboxSelectMultiple class.

结果我对 SelectMultiple 类有点搞砸了,就像这样。

class CheckboxCustom(forms.SelectMultiple):


    def __init__(self, *args, **kwargs):
        self.input_type = 'checkbox'
        self.checked_attribute = 'checked': True
        self.template_name = 'django/forms/widgets/checkbox_select.html'
        self.option_template_name = 'django/forms/widgets/checkbox_option.html'
        self.allow_multiple_selected = True
        self.request = kwargs.pop("request")
        self.option_inherits_attrs = False
        # print(options
        super(CheckboxCustom, self).__init__(*args, **kwargs)


    def create_option(self, *args, **kwargs):
        options_dict = super().create_option(*args, **kwargs)
        selected = options_dict['selected']
        print(selected)
        option_attrs = self.build_attrs(self.attrs, attrs) if self.option_inherits_attrs else 
        # if selected:
        #     options_dict['attrs']['multiple'] = True

        if options_dict['label'] != str(self.request.user.profile):
            options_dict['attrs']['disabled'] = True
            # print(val)

        return options_dict

并将其用作小部件。但是,无论我选择或取消选择两个复选框之一(从相应的配置文件中),另一个将在模板和数据库中都被取消选择。

如果我使用常规的 SelectMultiple 模板和输入类型,也会发生同样的事情。

有没有办法解决我的问题?

【问题讨论】:

好的,与其他类似的问题一样,它是一个 HTML“特性”,而不是一个 django 问题。将复选框呈现为禁用根本不会将任何数据发布到后端。我使用了“onclick”=“return false”,它工作正常,但我现在必须验证服务器端的数据和/或找出如何防止对复选框的操作 【参考方案1】:

我已经制定了一个解决方案,如果有人感兴趣,我会在这里发布。

正如我已经提到的,“禁用”属性不允许发布任何形式的数据。这意味着,在 MultipleSelect 字段中,无法选择禁用的选项,并且选项 POSTed 是唯一添加到数据库中的选项(禁用的选项是“删除”)。

为了绕过这一点,我为该字段提供了一个“只读”属性,后来我使用 CSS 对其进行了自定义,并使用一个小的 JS 脚本使其功能符合我的喜好。代码如下:

设置只读属性 (DJANGO)
    def create_option(self, *args, **kwargs):

        options_dict = super().create_option(*args, **kwargs)
        selected = options_dict['selected']
        value = options_dict['value']

        #This is my own custom logic. It can be altered of course
        if options_dict['label'] != str(self.request.user.profile):
        #This is where the attribute is set!
            options_dict['attrs']['class'] = 'readonly'

自定义只读字段以显示为灰色和“禁用”(CSS)
    input.readonly 
      opacity : .50;
      filter  : alpha(opacity=50); /* IE<9 */
      cursor  : default;
    
防止字段操作的小脚本:
    $('input.readonly').on('click', function(evt) 
    evt.preventDefault();
 )

【讨论】:

以上是关于在 django 3.0 中将复选框选项显示为“已禁用”。模型形式的主要内容,如果未能解决你的问题,请参考以下文章

禁用 Django ModelForm 中的空选项

如何解决这个问题:“请确保在“Internet”选项控制面板中已启用SSL 3.0或TLS 1.0”???

如何在 QTableWidget 中将布尔项显示为复选框?

如何在 rhandsontable 中将逻辑值显示为 UI 上的复选框

如何在闪亮应用程序的数据表中将逻辑列转换为静态复选框?

Django Booleanfield Checkbox 和 Label 分两行显示