问题如下:
我有一个class DocModel(EventDispatcher):
和一个doc
属性,该属性返回一个包含所有非零属性的字典,我将其用作我的ModelView
和ModelForm
类的模型>
ModelView
是要与Widget一起使用的mixin,以方便显示模型信息
ModelForm
是要与Widget一起使用的mixin,它将其输入字段值绑定到其模型,以便字段中的任何更改都会更改模型属性
分配给ModelForm.model
,将覆盖其字段的值
ModelForm.model
是AliasProperty(_get_model, _set_model, bind=['_model'])
,并且始终返回DocModel
代码的子类,如下所示:
#models.py
#DocModel is an EventDispatcher with a doc method that returns a dict
class User(DocModel):
profile = ObjectProperty()
class Profile(DocModel):
pass
class MetaModelView(object):
def get_model_cls(self):
model_cls = self._model_cls
if isinstance(model_cls, type) and issubclass(model_cls, DocModel):
return self._model_cls
else:
return getattr(sys.modules[__name__], self._model_cls)
model_cls = AliasProperty(get_model_cls, None)
_model = ObjectProperty(None, baseclass=DocModel, rebind=True)
def _get_model(self):
return self._model
def _set_model(self, model):
self.set_model(model)
model = AliasProperty(_get_model, _set_model, bind=['_model'])
class ModelView(MetaModelView):
#there is code here, but modelview is woring fine, no need to look into it
pass
class ModelForm(MetaModelView):
def set_model(self, model, *args):
#print 'model form set_model({}, {})'.format(model, args)
if model is None:
self.clear_fields() #sets all fields to default
if not isinstance(model, self.model_cls):
#print 'not model_cls'
if isinstance(model, DocModel):
#print 'is DocModel'
model = self.model_cls(**model.doc)
elif isinstance(model, dict):
#print 'is dict'
model = self.model_cls(**model)
else:
raise Exception('Invalid model type: {}'.format(type(model)))
#print self, model
if self._model is not None:
#if this is not the first assignment
#print '#overwrite fields'
self.set_fields(model.doc)
else:
self._model = model
def set_fields(self, doc={}):
ids = self.ids
#print 'ids', ids
print 'doc', doc
for field in self.fields:
print 'setting field {} to {}'.format(field, doc.get(field, None))
ids[field].data = doc.get(field, None)
#views.py
class Root(ModelView, Relativelayout):
_model_cls = 'User'
class MyForm(ModelForm, RelativeLayout):
_model_cls = 'Profile'
所以在kv中,我可以做这样的事情:
KV = '''
<Root>: #ModelView
MyForm: #ModelForm
model: root.model.profile
'''
因此,只要Root.model.profile
发生变化,MyForm._set_model(new_model)
就会运行,这就是问题发生的地方
MyForm.set_model()
内,我叫self.set_fields(model.doc)
此方法所做的全部工作就是用model.doc
属性(一个字典)中的数据填充字段,并且这样做是有价值的
但仅当我运行摘要的第43行或58行时
如果运行时注释了这些行,则当代码到达self.set_fields(model.doc)
时,model.doc
是空字典,我知道那是不对的。
所以我添加了这些行以检查是否将空模型传递到set_model
,而且正如我所期望的那样,不是。
瞧,字段设置正确了。。我很困惑,试图注释掉该行,问题又重演了
我可以在它们之间放置多个打印件,但是仅打印出模型本身并不会产生任何效果
我可以就可能发生的情况以及如何解决此问题获得一些意见吗?