-1

我正在使用 Django 2.2 表单,我试图理解为什么以下两个片段具有不同的行为。为什么将@staticmethod 传递给initial表单字段(片段A)与传递未绑定函数(片段B)的结果不同?

片段一:

class BankUpdateForm(forms.Form):
    @staticmethod
    def yesterday():
        return date.today() - timedelta(days=1)    

    from_date =  forms.DateField(initial=yesterday)
    to_date =  forms.DateField(initial=date.today)

片段 B:

def yesterday():
        return date.today() - timedelta(days=1)
class BankUpdateForm(forms.Form):
    from_date =  forms.DateField(initial=yesterday)
    to_date =  forms.DateField(initial=date.today)

片段 B 将按预期工作并显示正确的初始字段值。片段 A 只会打印函数的str.

在此处输入图像描述

4

2 回答 2

0

源代码

def get_initial_for_field(self, field, field_name):
    """
    Return initial data for field on form. Use initial data from the form
    or the field, in that order. Evaluate callable values.
    """
    value = self.initial.get(field_name, field.initial)
    if callable(value):
        value = value()
    return value

这表明,这yesterday不是可调用的方法,而是BankUpdateForm.yesterday

要执行staticmethods,您应该使用它们的类调用它,BankUpdateForm.yesterday,这在定义表单字段时是不可能的。

所以,你不必@staticmethod在这里使用装饰器,

# Method-1
class BankUpdateForm(forms.Form):

    def yesterday():
        return date.today() - timedelta(days=1)

    from_date = forms.DateField(initial=yesterday)
    to_date = forms.DateField(initial=date.today)

# Method-2 (You already have this)
def yesterday():
    return date.today() - timedelta(days=1)


class BankUpdateForm(forms.Form):
    from_date = forms.DateField(initial=yesterday)
    to_date = forms.DateField(initial=date.today)
于 2020-07-05T02:24:44.007 回答
0

因为昨天是 a staticmethod,所以callable(yestday)return False,然后在获取字段的初始值时返回函数。你可以放下@staticmethod装饰器,效果很好;或传递BankUpdateForm.yestdayinitial,它也是。请注意,静态方法应该由类或实例调用,即使它是在其类范围内调用的。

于 2020-07-05T02:50:05.050 回答