我创建了一个自定义小部件,它将使用选择选项保存日期+时间。 现在每个月,日,年,小时和分钟都有自己的选择框。
我尝试了许多不同的方法让这些选择框自动包含日期和当前时间。这个Evan是否可以通过我编写自定义小部件的方式来实现?
Bellow是初始化表单的类,
from widgets import SelectDateTimeWidget
class CreateEvent(forms.ModelForm):
class Meta:
model = Event
fields = ['title', 'start', 'end', 'description', 'category']
widgets = {
'start': SelectDateTimeWidget(date_format= '%d/%m/%Y'),
'end': SelectDateTimeWidget(date_format= '%d/%m/%Y')
}
自定义小部件(包含另一个自定义小部件):
class SelectDateTimeWidget(forms.MultiWidget):
supports_microseconds = False
def __init__(self, attrs=None, date_format=None, time_format=None):
widgets = (SelectDateWidget(empty_label=( "Year", "Month", "Day")),
SelectTimeWidget(use_seconds=False))
super(SelectDateTimeWidget, self).__init__(widgets, attrs)
def decompress(self, value):
if value:
value = to_current_timezone(value)
return [value.date(), value.time().replace(microsecond=0)]
return [None, None]
def subwidgets(self, name, value, attrs=None):
if self.is_localized:
for widget in self.widgets:
widget.is_localized = self.is_localized
# value is a list of values, each corresponding to a widget
# in self.widgets.
if not isinstance(value, list):
value = self.decompress(value)
output = []
final_attrs = self.build_attrs(attrs)
id_ = final_attrs.get('id')
for i, widget in enumerate(self.widgets):
try:
widget_value = value[i]
except IndexError:
widget_value = None
if id_:
final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
return output
无论如何我可以将值设置为当前日期吗?
谢谢J
答案 0 :(得分:0)
来自Django docs:
小部件是Django对HTML输入元素的表示。小部件处理HTML的呈现,以及从与小部件对应的GET / POST字典中提取数据。
因此,添加默认值(如当前日期)不是窗口小部件的用途。这是形式字段的用途。如果您想为表单添加默认值,那么最好通过表单字段进行,如下所示:
your_field = forms.DateField(initial=datetime.date.today)
# in case of modelForm, just override the fields you need.
或初始化表单时
form = CreateEvent(
initial={'start': datetime.datetime.now, 'end': datetime.datetime.now}
)
相关文档:providing initial values to form field和providing initial values to modelForm