我想编写一个自定义表单字段(也可能是小部件),但我不确定表单实例是如何在请求之间共享的。例如,如果我使用模型实例中的数据呈现表单,当我验证数据时该实例是否仍然可用?如果是这样,这是否意味着有另一个数据库命中以在请求之间再次查找模型?
同样,如果我编写了一个自定义字段,该字段接收要在其__init__
方法中显示的数据列表,那么当用户发布数据时,该数据列表是否可用于验证?
如果有人能指出发生这种情况的 django 源代码的某些部分,那将非常有帮助。我一直在看models.py
,和from forms.py
,但我仍然不能 100% 确定它是如何工作的。fields.py
widgets.py
django.forms
最终,我想要做的是有一个像这样工作的字段(关键部分是最后一行):
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 完成此操作,但将其全部合并到表单字段中会很好。