Django SelectTimeWidget 只读
这是我的Django代码,
class Fpool_Booked(forms.Form):
From = forms.CharField(label = 'Departure Place',max_length = 30,widget=forms.TextInput(attrs={'readonly':'readonly'}),error_messages = {'required': 'Please enter From where do you want to go'})
To = forms.CharField(label = 'Destination Place',max_length = 30,widget=forms.TextInput(attrs={'readonly':'readonly'}),error_messages = {'required': 'Please enter destination'})
From_Time = forms.TimeField(label = 'Departure Time',widget = SelectTimeWidget(attrs={'readonly':'readonly'},twelve_hr = True))
如你所见,我已经把文本框设置为只读,这个功能运行得很好。现在我想把SelectTimeWidget也设置为只读。我尝试过用attrs={'readonly':'readonly'}
,但效果并不如我所愿。有没有什么办法可以解决这个问题呢?
2 个回答
0
我需要在我的表单中禁用一个下拉选择框,所以我用了这段代码来让这个字段不可用:
def __init__(self, *args, **kwargs):
self.fields['field_name'].widget.attrs['disabled'] = True
这个下拉输入框没有'readonly'这个属性。
0
SelectTimeWidget 是一个基于 SelectDateWidget 的自定义小部件。我觉得它不支持“只读”模式。我可能说得有点多,但我试了一下,得出了以下内容,希望能帮到你,如果你真的想这么做的话……
我把 SelectTimeWidget 的代码片段放进了我的代码里,然后修改了以下几行:
def __init__(self, attrs=None, hour_step=None, minute_step=None, second_step=None, twelve_hr=False):
改成:
def __init__(self, attrs={'readonly':'readonly'}, hour_step=None, minute_step=None, second_step=None, twelve_hr=False):
还有:
select_html = Select(choices=hour_choices).render(self.hour_field % name, hour_val, local_attrs)
select_html = Select(choices=minute_choices).render(self.minute_field % name, minute_val, local_attrs)
select_html = Select(choices=second_choices).render(self.second_field % name, second_val, local_attrs)
改为:
select_html = TextInput().render(self.hour_field % name, hour_val, local_attrs)
select_html = TextInput().render(self.minute_field % name, minute_val, local_attrs)
select_html = TextInput().render(self.second_field % name, second_val, local_attrs)
当我想把值放进表单字段,并且希望能动态访问和更改表单时,我使用了以下的表单样式。
class time_form(forms.Form):
def __init__(self, *args, **kwargs):
super(time_form, self).__init__(*args, **kwargs)
self.fields['From'] = forms.CharField(widget=forms.TextInput(attrs={'onchange':'this.form.submit()'}))
self.fields['To'] = forms.CharField(widget=forms.TextInput(attrs={'onchange':'this.form.submit()'}))
self.fields['From_Time'] = forms.TimeField(widget = SelectTimeWidget())
在视图中,我设置了一些值来看看效果:
form = time_form({'From_Time':'12:34:56 P.M.',})
注意,我在 attrs={'onchange':'this.form.submit()'} 中保留了这个设置,主要是为了好玩,如果你想在更改时动态更新表单的话(也为了展示 attr= 的用法),不过我发现这个通常在选择框中效果最好。在表单中,你可以访问“From”和“To”的值(例如,var = args[0].get('To')),并更新“From_Time”(args[0]['From_Time']= 某个函数)。
其次,“From_Time”小部件现在只是一个华丽的只读文本输入框,它可以解析时间格式,所以这看起来有点复杂。