проблема заключается в следующем:
У меня есть class DocModel(EventDispatcher):
со свойством doc
, которое возвращает dict со всеми ненулевыми свойствами, которое я использую в качестве модели для моих ModelView
и ModelForm
классов
A ModelView
- это миксин, который будет использоваться с виджетом для облегчения отображения информации о модели
A ModelForm
- это миксин, который будет использоваться с виджетом, который привязывает значения своих входных полей к своей модели, так что любое изменение в поле изменяет свойства модели
Присваивание 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()
, в строке 62 фрагмента кода выше, я звоню self.set_fields(model.doc)
все, что делает этот метод, - это заполняет поля данными из свойства model.doc
(dict), и для чего бы то ни было, он делает это
но только если я запускаю строку 43 или 58 фрагмента
если запускать с этими закомментированными строками, когда код достигает self.set_fields(model.doc)
, model.doc
- пустой дикт, который, как я знал, не может быть правдой.
поэтому я добавил эти строки, чтобы проверить, передавалась ли пустая модель в set_model
, и, как я и ожидал, это не было ..
и вот, поля были установлены правильно .. Я был сбит с толку, и попытался закомментировать строку, и проблема повторилась
Я могу нанести несколько отпечатков между ними, но только распечатка модели сама имеет какой-либо эффект
Могу ли я получить некоторые мнения о том, что может происходить и как это решить?