1

在 formsets.py 中,您可以找到此代码片段

class BaseFormSet(StrAndUnicode):
    """
    A collection of instances of the same Form class.
    """
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
                 initial=None, error_class=ErrorList):
        ...
        self.prefix = prefix or self.get_default_prefix()   # Note the self.get_default_prefix
        ...
    ...
    @classmethod                                            # Note the @classmethod
    def get_default_prefix(cls):
        return 'form'

为什么 get_default_prefix 以这种方式声明,然后用 self. 调用?这样做有什么收获吗? get_default_prefix在 BaseInlineFormSet (forms/models.py) 中有另一个定义

class BaseInlineFormSet(BaseModelFormSet):
    ...
    @classmethod
    def get_default_prefix(cls):
        from django.db.models.fields.related import RelatedObject
        return RelatedObject(cls.fk.rel.to, cls.model, cls.fk).get_accessor_name().replace('+','')

和另一个BaseGenericInlineFormset再次使用@classmethod,所以它似乎不是一个错字。我只是不明白为什么会这样做,然后用self调用。

我看到的唯一线索(我不明白)是管理员似乎用FormSet.get_default_prefix()

我想知道是否有一些我对 python 不了解的地方。

4

1 回答 1

1

从实例调用类方法是完全合法的,正如您在代码中看到的那样。相关的 stackoverflow帖子说从实例调用没有任何好处,(而且这是不好的做法);因为如果你只是从实例调用你的方法可能不应该是classmethod.

不过,我认为您回答了自己的问题。如果 django 从某个地方调用FormSet.get_default_prefix(),那么他们可能不想实例化一个 formset 对象

于 2013-03-13T18:52:00.453 回答