在 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 中将复选框选项显示为“已禁用”。模型形式的主要内容,如果未能解决你的问题,请参考以下文章
如何解决这个问题:“请确保在“Internet”选项控制面板中已启用SSL 3.0或TLS 1.0”???