【问题标题】:django DateTimeField in form (initial value)表单中的 django DateTimeField(初始值)
【发布时间】:2017-03-17 14:30:20
【问题描述】:

我对 Django 表单中 DateTimeField 的初始值没有什么问题。

我在 forms.py 中有声明

class FaultForm(forms.ModelForm):
    ...
    date_time = forms.DateTimeField(initial=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), required=False)
    ...

我在 models.py 中有声明

class Fault(models.Model):
    ...
    # date time
    date_time = models.DateTimeField(default=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    ...

问题在于返回适当的时间。 当我使用 forms.py 中的初始/默认日期时间将一些对象添加到我的数据库时,每个对象的时间完全相同。

但是当我从模板中添加带有日期时间的对象时,我对数据库中的每个对象都有很好的日期时间。

我必须告诉我的函数返回日期时间在这两种情况下完全相同,但可能问题在于生成表单?我们有相同的时间,因为我们生成一次表单,或者类似的东西??

我不知道该怎么做,因为我想使用表单中的初始值,而不必在模板中再次这样做。

有什么想法吗??漏洞??其他日期时间功能??有什么办法可以解决这个小问题??

请帮帮我:)

【问题讨论】:

    标签: python django forms datetime


    【解决方案1】:

    Django 模型字段在编译时进行评估。在上面的示例中,default 值被评估一次。

    要解决这个简单的问题,请将 default 参数设置为可调用对象:

    def get_now():
        return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    class Fault(models.Model):
        date_time = models.DateTimeField(default=get_now)
    

    【讨论】:

    • 虽然这可能有效,但应该更喜欢内置的auto_now。
    • 也许,但这取决于具体情况,在这个问题中没有足够的信息来可靠地表明这一点。
    • 没错,既然没有足够的信息,人们应该总是喜欢内置的。
    • 很好的解决方案,但没有按我的意愿工作,我有两个对象一个接一个添加的时间你想知道什么??
    【解决方案2】:

    每次为对象分配内存时,使用 FaultForm 类中的以下 Python 方法进行初始化:

    def __init__(self, *args, **kwargs):
        kwargs.update( initial = { 'date_time': datetime.now() } )
        super( FaultForm, self ).__init__( *args, **kwargs )
    

    Explicit return in init

    【讨论】:

    • 您也可以在super() 调用之后覆盖initial,例如self.initial['date_time'] = datetime.now()。对我来说似乎不那么尴尬了。
    【解决方案3】:

    您正在调用函数datetime.now().strftime("%Y-%m-%d %H:%M:%S") 并按此分配default。因此,在运行时,now() 将被评估并存储为默认值。因此,您会在所有对象中看到相同的日期时间。您需要使用auto_now argument 并将其设置为True。

    型号-

    class Fault(models.Model):
        ...
        date_time = models.DateTimeField(auto_now=True)
        ...
    

    【讨论】:

    • 在这个解决方案中我有这样的错误:django.core.exceptions.FieldError: 'date_time' cannot be specified for Fault model form 因为它是一个不可编辑的字段我尝试禁用此字段但它无论如何都不起作用
    • 如果您希望该字段可编辑,请删除模型表单中的auto_now=True 部分。
    • 所以你的回答没用。你告诉我我需要使用 auto_now 参数来解决我的问题但是当这个参数给我另一个问题时你告诉我我必须删除 auto_now ?它对我有什么帮助??
    • 您没有在问题中提供具体信息。无论如何,auto_now 将始终添加日期时间,并将该字段呈现为不可编辑。您必须在自动添加或使用可编辑字段之间进行选择,为此您提供initial。简单明了,您只需从模型字段中删除auto_now 并将initial 保留在表单字段中,就像我的回答+评论说的那样。而且我的回答不是“无用”,因为我还指出了“为什么”您的解决方案不起作用。
    • 我告诉它是因为您告诉添加“auto_now”并且在测试之后您告诉删除“auto_now”,所以我在同一个地方所以在您回答之前。无论如何,我读了一些关于“auto_now”以及如何使用它的东西,经过小小的改动,现在一切都很好,所以我会加上这个答案
    猜你喜欢
    • 1970-01-01
    • 2018-05-22
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多