请求之间的Form / ModelForm实例

时间:2012-08-30 05:02:22

标签: django django-forms

我想写一个自定义表单字段(也可能是小部件),我不确定如何在请求之间共享表单实例。例如,如果我使用模型实例中的数据呈现表单,那么在验证数据时该实例是否仍然可用?如果是这样,这是否意味着还有另一个数据库命中以在请求之间再次查找模型?

同样,如果我编写一个自定义字段,该字段包含要在其__init__方法中显示的数据列表,那么该数据列表是否可用于在用户POST数据时进行验证?

如果有人能指出我发生这种情况的django源的部分,那么真的会有所帮助。我一直在关注来自models.pyforms.pyfields.pywidgets.pydjango.forms,但我仍然不能100%确定这一切是如何运作的进行。

最终,我想做的是有一个像这样的字段(关键部分是最后一行):

class CustomField(ChoiceField):
    def __init__(self, data_dict, **kwargs):
        super(CustomField, self).__init__(**kwargs)
        self.data_dict = data_dict
        self.choices = data_dict.keys()
    def validate(self, value):
        if value not in self.data_dict:
            raise ValidationError("Invalid choice")
        else:
            return self.data_dict[value]

下次请求会提供data_dict吗?如果我创建自定义forms.Form并使用data_dict对其进行初始化,那么下次请求是否可以使用它? (例如,使用工厂方法或其他东西......)。

旁注:我这样做是因为我想(最终)使用Bootstrap的typeahead这样的东西,我想传递它“漂亮的价值”,然后我转换服务器端(基本上,就像select中的选项值如何具有不同的提交值)。我过去曾使用客户端javascript完成此操作,但将它们整合到表单字段中会很不错。

1 个答案:

答案 0 :(得分:2)

形式没有什么神奇之处。与Django中的所有其他内容(或任何Web框架)一样,对象不会在请求之间保留,并且每次都需要重新实例化。这种情况发生在表单处理的普通视图模式中:您为POST实例化一次,为GET单独设置一次。如果您有与表单相关联的数据,则每次都需要传递数据。