Python 在何处存储现场数据以及如何提供对其的访问?
Python 在何处存储现场数据以及如何提供对其的访问?,python,design-patterns,Python,Design Patterns,表单具有字段,字段具有值。但是,他们只有在提交表单后才能获得值 我应该如何存储此值?我应该给每个字段指定一个value属性,field.value, 在发布之前,将其保留为None,并在后记中填写 完全忽略它,并动态添加它 将其存储在表单上,如form.data['field'] 创建一个包装类FieldWithData,以避免任何不一致的状态(如果您有这种类型的对象,您知道它有数据),并允许我在初始值设定项中设置数据,而不是直接访问属性(尽管我想这与使用setter没有太大区别) 如何通过
表单
具有字段
,字段
具有值
。但是,他们只有在提交表单后才能获得值
我应该如何存储此值?我应该给每个字段指定一个value属性,field.value
,
- 在发布之前,将其保留为
None
,并在后记中填写李>
- 完全忽略它,并动态添加它李>
- 将其存储在表单上,如
form.data['field']
李>
- 创建一个包装类
FieldWithData
,以避免任何不一致的状态(如果您有这种类型的对象,您知道它有数据),并允许我在初始值设定项中设置数据,而不是直接访问属性(尽管我想这与使用setter没有太大区别)
如何通过表单
对象访问字段数据?选项:
form.fields['name'].value
(它当前在内部的存储方式)
form.data['field']
(创建一个代理“data”类,从字段中检索真实数据,或者重新排列内部结构以实际存储如下数据)
form.field.value
-看起来相当不错,但是我会有两个对同一个字段的引用,一个是form.field
,另一个是form.fields['field']
,这是我在内部需要的,以便我可以迭代它们
太多的设计决策。快把我逼疯了。这就是单独完成一个项目的糟糕之处。这实际上取决于你如何与相关结构互动。在给对象赋值之前,您是否操作表单
和字段
对象?是否需要频繁迭代所有给定的字段
?提交后是否需要表格
?等等
我建议编写一些/所有使用表单的代码,并弄清楚如何与表单
数据交互,以及理想的界面是什么样子。我会将表单的定义和表单的值与提交分开。也就是说,字段(定义)对象上没有值
属性
要处理提交的值,我可能会使用dict。您可以让Form类处理此dict的创建:
# assuming my_form is a Form object and request represents the HTTP request
form_values = my_form.values_from_request(request)
print(form_values["Name"])
values\u from\u request
方法将迭代表单的字段(定义)以从HTTP请求获取提交的数据。该方法还可以进行验证和数据类型转换。我将请求/发布数据传递到表单中。我也需要它来渲染字段,而不仅仅是检索它们的值。我想我可以将请求数据传递到每个方法中,但我认为这只会使它更加复杂。更容易在表单上保留引用。如果该方法也执行验证,那么如果它返回表单值,它如何返回is_valid状态?一个元组?这听起来很像Django是怎么做的。在Django中,您可以:f=MyForm(request.POST);如果f.是有效的():。。。;f、 已清除的_数据[“名称”]。。。看见重新。若要回答这个问题,我可能会让来自_请求的值_在无效数据上引发ValidationException。这是一种有趣的方法。。。Django的方法有一点让我恼火,那就是他们鼓励的流程:如果发布,则设置表单w/数据,否则设置表单w/输出数据
;我真的很讨厌两次初始化表单的冗余,尤其是当它可以通过检查变量轻松确定是否有数据时。你的想法很有趣。。。但是,如果您没有在表单中存储数据的本地副本,它仍然没有解决如何呈现表单。def render_as_html(self,field_values={}),但不能通过模板传入变量…因此必须在视图中调用该render函数,然后将输出传递给模板。这是一个有效的解决方案,但我不喜欢:)谢谢。理想情况下,我想我希望通过form.data['field']
访问它,以防止意外修改其他字段属性(这在当时并不重要,因为它已经被渲染过了),而且还可以保持它的整洁,让开发人员只访问他们需要的内容。但是,在内部,我认为将所有字段属性分组更有意义。即,将值保留在字段上。然而,现在在我希望如何在内部访问它和我希望如何访问它之间存在差异。这导致了这个代理的想法。。。但是这听起来不是有点难看吗?--虽然如果我改用form.data('field')
,它会成为一个易于实现的方法……但是,当你开始嵌套它们时,语法就变得更加不明显了。。我必须使用form.data('field','subfield')
而不是form.data['field']['subfield']
。我将使用form.data('subform.field')
sol'n,并将字段
对象上的值保存在内部。data()
方法只是一个方便的包装器。看起来效果不错。