【问题标题】:Django forms: initial field value not working with @staticmethod vs unbound functionDjango 表单:初始字段值不适用于 @staticmethod 与未绑定函数
【发布时间】:2020-07-05 01:08:02
【问题描述】:

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

片段 A:

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

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    来自source code

    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)

    【讨论】:

    • 静态方法可以直接使用对象而不是类调用:stackoverflow.com/questions/136097/…
    • 您能在此处引用您想要引用的确切答案吗?不幸的是,我没有看到任何不使用类调用静态方法的示例
    • 第一个答案显示了它。顺便说一句,我的观点是:对象也可以调用静态方法。
    • 是的,对象也可以调用staticmethods,但在这种情况下不能,因为我们这里没有对象。 @TâmerPinheiro
    【解决方案2】:

    因为yestday是staticmethod,所以callable(yestday)返回False,那么就返回函数 获取字段的初始值时。您可以直接删除@staticmethod 装饰器,效果很好; 或将BankUpdateForm.yestday 传递给initial,它也可以。 请注意,静态方法应该由类或实例调用,即使它是在其类范围内调用的。

    【讨论】:

      猜你喜欢
      • 2021-01-22
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 2010-12-25
      相关资源
      最近更新 更多