django - 请求之间的 Form/ModelForm 实例

标签 django django-forms

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

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

如果有人能向我指出发生这种情况的 django 源代码的部分内容,那将会非常有帮助。我一直在看models.py , forms.py , fields.pywidgets.py来自django.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 这样的东西我想传递它“漂亮的值”,然后我将其转换为服务器端(基本上,就像选择中的选项值如何可以具有不同的提交值)。我过去曾使用客户端 JavaScript 完成此操作,但最好将其全部合并到表单字段中。

最佳答案

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

关于django - 请求之间的 Form/ModelForm 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190192/

相关文章:

python - Worker 未运行 Python + Django + Celery + Redis

django - 如何在 Django 的单元测试驱动程序中测试表单的验证逻辑?

python - 无法在 django 中为 forms.ChoiceField 设置初始值

python - Django ModelFormSet 单击 "Submit"保存表单但不更新到数据库

django - 从 Django Auth 中的 UserChangeForm 中排除用户名或密码

Django 表单 request.user

django - 为什么我可以连接到http ://127. 0.0.1 :8000/but not to http://192. 168.1.6/

python - Django 查询集 : Need help in optimizing this set of queries

python - 使用 django-filter,有没有一种快速的方法来支持所有可能的字段查找?

python - 在简单的电子商务数据库中创建一个 OrderItem 或将一个 LineItem 链接到一个订单?