【问题标题】:Form/ModelForm instances between requests请求之间的 Form/ModelForm 实例
【发布时间】:2012-08-30 05:02:21
【问题描述】:

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

同样,如果我编写了一个自定义字段,该字段接收要在其__init__ 方法中显示的数据列表,那么当用户发布数据时,该数据列表是否可用于验证?

如果有人可以将我指向 django 源代码中发生这种情况的部分,那将是 真正 有帮助的。我一直在查看来自django.formsmodels.pyforms.pyfields.pywidgets.py,但我仍然不能 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 之类的东西,并且我想将其传递给服务器端的“漂亮值”(基本上,就像选项选择中的值可以具有不同的提交值)。过去我使用客户端 javascript 完成了此操作,但最好将其全部合并到一个表单字段中。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

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

    【讨论】:

    • 好的,这很有帮助。所以如果你将一个实例传递给一个模型表单,你就不能用它来验证数据,除非你在数据库中查询它?
    猜你喜欢
    • 1970-01-01
    • 2019-12-25
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    相关资源
    最近更新 更多