6

首先是一点背景......我正在查看表单的 Django 源代码,以了解 Django 中表单的实现(并在此过程中学习一些 Python)。Django 使用 DeclaredMetaFields MetaClass实现表单。

这是一个非常粗略的类 Django 表单实现的类图(链接到 gist 中的示例代码)。

ContactForm 的类 Django 表单实现 - 类图

这是一个实例图。

ContactForm 的类 Django 表单实现 - 实例图

这是同一个类的一个非常粗略的实现,而不使用元类(链接到 gist 中的示例代码)。

ContactForm 的一个简单粗暴的实现

我了解元类概念等,并了解 Django 代码是如何工作的。现在回答问题。

  1. 除了语法优雅等明显的好处之外,元类实现还有其他好处吗?
  2. 是否可以在不借助 BoundField 之类的中间对象的情况下实现类似元类的实现?
4

1 回答 1

2

好吧,语法上的好处很重要。毕竟,即使是 OOP 语言中的类也只是该语言的语法优势。

在您非常粗略地实现无元类表单实现的示例中,您描述了字典中的字段。好吧,您可能已经忽略了它实际上是SortedDict,因为字段的顺序很重要。所以我还需要定义fields_order列表。

下一件大事是ModelForm。元类方法允许简单地说我使用哪个模型以及Meta属性中的哪些字段,它会自动创建字段并将其映射到模型。如果没有元类方法,我可能不得不使用类似CreateFieldsFromModeland的东西MapFieldsToModel。或者你可以在__init__方法中为我这样做。但是等等,__init__方法已经足够复杂了,有很多参数,比如data, initial,files等等。

class MyForm(Form):
    fields = {
        'one': ...
        ...
    }
    fields_order = [...]
    model_fields = ???

Class MyForm2(MyForm):
    fields = MyForm.fields + {...}

# ... hey this API sucks! I think I'll go with another framework.

还有更多可以在表单中配置的东西,并且所有内容都记录在案。

所以对我来说,由于巨大的配置逻辑,它看起来Form只是要求通过定义对象和工厂逻辑来实现。这里有 python 及其元类来向用户隐藏工厂。它很酷,因为它让初学者少思考。

好吧,是的,它的语法糖无处不在,而且它的全部内容都是为了使 API 易于使用。

是的,可以不使用 Metaclasses/BoundField 或其他任何东西。最后,可以在一个函数中编写所有表单实现,并在一个大字典(或 xml?)中定义所有定义,但这是否易于使用、易于理解、易于扩展?

于 2011-03-30T08:07:01.960 回答