Django 表单:在 DateField 上设置初始值

问题描述 投票:0回答:6

我有以下代码来设置 DateField 和 CharField 的初始值。 CharField 的初始值已正确设置,但 DateField 的初始值仍然为空。

class MyForm(forms.ModelForm):
    dummy = fiscal_year_end = forms.CharField()
    date = forms.DateField()

    def __init__(self, *args, **kwargs):

        super(MyForm, self).__init__(*args, **kwargs)
        today = datetime.date.today()
        new_date = datetime.date(year=today.year-1, month=today.month, day=today.day)
        self.fields["date"].initial = new_date
        self.fields["dummy"].initial = 'abc'
python django django-forms
6个回答
18
投票

您可以在创建日期字段的同一行中设置默认值:

date = forms.DateField(initial=datetime.date.today)

或者,如果您想传递特定日期,您可以创建一个函数并将其传递给 DateField,如下所示:

def my_date():
    return datetime.date(year=today.year-1, month=today.month, day=today.day)


class MyForm(forms.ModelForm):
    #...
    date = forms.DateField(initial=my_date)
    #...

此外,您可以查看docs以获得更多帮助;)


5
投票

我不确定这是否回答了(不是100%清楚)最初的问题,但我来到这里,所以这是我的解决方案。

日期字段的 HTML

value
属性包含日期,但其格式取决于语言,并且从来不是预期的格式。强制日期为 ISO 格式就可以了:

class MyForm(forms.ModelForm):
    my_date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.initial['my_date'] = self.instance.my_date.isoformat()  # Here

2
投票

老问题,但当您使用简单的日期时间对象时它会起作用。例如。

tomorrow = datetime.today() + timedelta(days=1)
send_at_date = forms.DateField(
    required=True,
    initial=tomorrow,
    widget=DateInput(attrs={"type": "date"}),
)

希望这对其他人有帮助。


1
投票

我发现无论语言环境如何,它都可以工作的一种方法是定义一个函数,通过强制预期的格式返回日期。

import datetime
def today_ymd():
    """Return today in format YYYY-MM-DD"""
    return datetime.date.today().strftime('%Y-%m-%d')

然后将该函数的引用传递给初始参数(不带括号的函数名称)。

class MyForm(forms.Form):
    my_date = forms.DateField(
        initial=today_ymd,
        widget=forms.DateInput(attrs={'type': 'date'}),
    )

0
投票

我已经尝试了所有建议的解决方案,但没有一个有效。唯一对我有用的是使用 JavaScript 设置日期。

{% block js %}
    {{block.super}}
    <script>
        function date_2_string(dt) {
            let day = ("0" + dt.getDate()).slice(-2);
            let month = ("0" + (dt.getMonth() + 1)).slice(-2);
            let today = dt.getFullYear()+"-"+(month)+"-"+(day);
            return today
        }
        function current_date() {
            let now = new Date();
            return date_2_string(now)
        }
        $("#date").val(current_date());
    </script>
{% endblock js %}

0
投票

这个代码适用于我的情况

设置init方法!

覆盖您要更改属性的表单

并设置需要更改的初始值

def __init__(self, *args, **kwargs):
    super(AssignedModelForm, self).__init__(*args, **kwargs)
    self.initial['finished_date'] = timezone.now()  # Here
© www.soinside.com 2019 - 2024. All rights reserved.