Django 表单向导 - 为文本输入字段设置默认值

Django Form Wizard - Setting default value for text input field

我正在为我的 ModelForm 向导中的日期字段制作一个小部件。我想用一个小部件来实现这一点,这样我就可以保留 Django 的 ModelForm 的所有不错的验证功能。

我正在根据 django.forms.extras.widgets.SelectDateWidget 的这一部分对我的小部件进行建模:

def create_select(self, name, field, value, val, choices, none_value):
    if 'id' in self.attrs:
        id_ = self.attrs['id']
    else:
        id_ = 'id_%s' % name
    choices.insert(0, none_value)
    local_attrs = self.build_attrs(id=field % id_)
    s = Select(choices=choices)
    select_html = s.render(field % name, val, local_attrs)
    return select_html

请注意,我可以通过影响 choices 变量来添加到列表选择列表中,该变量通过 django.forms.widgets import Select

更改最终的 html 渲染

但是,我更愿意让用户简单地输入年份和日期,而不是摸索着下拉菜单。因此,对于那些,我已经转换了小部件以利用它:

def create_input(self, name, field, value, val, none_value):
    if 'id' in self.attrs:
        id_ = self.attrs['id']
    else:
        id_ = 'id+%s' % name
    local_attrs = self.build_attrs(id=field % id_)
    inp = TextInput()
    select_html = inp.render(field % name, val, local_attrs)
    return select_html

它工作得很好,但在这里设置一个默认值会很酷。这可能来自小部件或表单吗?:

class EventRegistrationForm4(forms.ModelForm):
    class Meta:
        model = Event
        fields = ['start_date', 'start_time', 'end_time']
        this_year = datetime.date.today().year
        widgets = {
            'start_date': InputDateWidget(),
            }

我认为您可以在小部件中简单地完成,只需测试一下,如果 val 为空,如果为空,则像这样输入您的默认值:

def create_input(self, name, field, value, val, none_value):
    if 'id' in self.attrs:
        id_ = self.attrs['id']
    else:
        id_ = 'id+%s' % name
    local_attrs = self.build_attrs(id=field % id_)
    inp = TextInput()
    if val == None or val == '': 
        val = '2015-11-29' # or use datetime.now(), or compute another good default
    select_html = inp.render(field % name, val, local_attrs)
    return select_html