2014-12-05 14 views
2

Я использую cms Plone для создания формы, содержащей две другие схемы.Как создать z3c.form с несколькими схемами?

С Group Forms я смог включить оба поля из двух схем. Однако они теряют все свои свойства, такие как скрытые или когда я использую datagridfield для построения таблицы. То, что я хочу сделать, - это иметь обе эти формы со своими полями и сохранить, чтобы сохранить их в объекте, на который была нажата ссылка как родительская -> объект 1 [верхняя часть формы] -> объект 2 [дно формы]

Вот мой питон код:

class QuestionPart(group.Group): 
    label = u'Question Part' 
    fields = field.Fields(IQuestionPart) 
    template = ViewPageTemplateFile('questionpart_templates/view.pt') 

class Question(group.Group): 
    label = u'Question' 
    fields = field.Fields(IQuestion) 
    template = ViewPageTemplateFile('question_templates/view.pt') 

class QuestionSinglePart(group.GroupForm, form.AddForm): 
    grok.name('register') 
    grok.require('zope2.View') 
    grok.context(ISiteRoot) 
    label = u"Question with Single Part" 

    ignoreContext = True 
    enable_form_tabbing = False 

    groups = (Question,QuestionPart) 

def update(self): 
    super(QuestionSinglePart, self).update() 

Этот код показывает, как поля IQuestion, IQuestionPart без связи вещей, как: form.mode (contype = «скрытый») или DataGridField. Я нашел способ отображения правильной формы с подсказками полей.

class QuestionSinglePart(AutoExtensibleForm, form.AddForm): 
    grok.require('zope2.View') 
    grok.context(ISiteRoot) 

    label = u"Question" 
    schema = IQuestion 
    additionalSchemata = (IQuestionPart,)        

Я чувствую, что я еще далеко. Я говорил с некоторыми людьми. Теперь я пытаюсь использовать отдельную форму и представление.

До сих пор, я в этот момент с моим кодом:

class QuestionSinglePartForm(AutoExtensibleForm, form.Form): 

    ignoreContext = True 

    autoGroups = True 
    template = ViewPageTemplateFile('questionsinglepart_templates/questionsinglepartform.pt') 

    @property 
    def additionalSchemata(self): 
     return self._additionalSchemata 

    def __init__(self, context, request, schema, additional=()): 
     self.context = context 
     self.request = request 
     if not IInterface.providedBy(schema): 
      raise ValueError('Schema is not interface object') 
     self._schema = schema 
     if not all(IInterface.providedBy(s) for s in additional): 
      raise ValueError('Additional schema is not interface') 
     self._additionalSchemata = additional 

class QuestionSinglePartView(object): 

    schema = IQuestion 
    additional = (IQuestionPart,) 

    def __init__(self, context, request): 
     self.context = context 
     self.request = request 
     self.form = QuestionSinglePartForm(context, request, self.schema, self.additional) 

    def magic(self, data, errors): 
     pass 
     """ 
     question = Question() 
     question.number = data['number'] 
     question.questionContent = data['questionContent'] 

     questionPart = QuestionPart() 
     questionPart.typeOfQuestion = data['IQuestionPart.typeOfQuestion'] 
     questionPart.explanation = data['IQuestionPart.explanation'] 
     questionPart.fileSize = data['IQuestionPart.fileSize'] 
     questionPart.fileType = data['IQuestionPart.fileType'] 
     questionPart.hints = data['IQuestionPart.hints'] 
     questionPart.table = data['IQuestionPart.table'] 
     questionPart.contype = data['IQuestionPart.contype'] 
     questionPart.content = data['IQuestionPart.content'] 
     """ 

    def update(self, *args, **kwargs): 
     if self.request.get('REQUEST_METHOD') == 'POST': 
      data, errors = self.form.extractData() 
      self.magic(data, errors) 
     self.formdisplay = self.form.render() 

    def __call__(self, *args, **kwargs): 
     self.update(*args, **kwargs) 
     return self.index(*args, **kwargs) 

Я борюсь с оказанием формы и что объект QuestionSinglePart не имеет атрибута индекса.

После нескольких часов работы с некоторыми разработчиками plone мы выяснили, что происходит.

я оставил из:

@property 
    def schema(self): 
     return self._schema 

мне нужно, чтобы определить индекс в представлении следующим образом:

index = ViewPageTemplateFile('questionsinglepart_templates/questionsinglepart.pt') 

мне нужно, чтобы добавить это мнения Init:

alsoProvides(self.form, IWrappedForm) 

В методе обновления для просмотра мне нужно было вызвать это до формы displa у. Я мог бы также удалить извлечение данных и переместить их в форму.

def update(self, *args, **kwargs): 
    self.form.update(*args, **kwargs) 
    self.formdisplay = self.form.render() 

Я все еще в настоящее время работает, чтобы получить данные для сохранения в объекты.

ответ

0

Вот мой окончательный код с изменениями выше. Были проблемы с индексом для объекта. Мне нужно было создать простой пользовательский вид. Я забыл свойство для схемы на форме. Мне также нужно изменить метод обновления для представления.

class QuestionSinglePartForm(AutoExtensibleForm, form.Form): 

    ignoreContext = True 

    autoGroups = False 

    @property 
    def schema(self): 
     return self._schema 

    @property 
    def additionalSchemata(self): 
     return self._additionalSchemata 

    def __init__(self, context, request, schema, additional=()): 
     self.context = context 
     self.request = request 
     if not IInterface.providedBy(schema): 
      raise ValueError('Schema is not interface object') 
     self._schema = schema 
     if not all(IInterface.providedBy(s) for s in additional): 
      raise ValueError('Additional schema is not interface') 
     self._additionalSchemata = additional 

    @button.buttonAndHandler(u'Save') 
    def handleSave(self, action): 
     data, errors = self.extractData() 
     if errors: 
      return False 
     obj = self.createAndAdd(data) 
     if obj is not None: 
      # mark only as finished if we get the new object 
      self._finishedAdd = True 
      IStatusMessage(self.request).addStatusMessage(_(u"Changes saved"), "info") 
     print data 

    @button.buttonAndHandler(u'Cancel') 
    def handleCancel(self, action): 
     print 'cancel' 



class QuestionSinglePartView(object): 

    schema = IQuestion 
    additional = (IQuestionPart,) 
    index = ViewPageTemplateFile('questionsinglepart_templates/questionsinglepart.pt') 

    def __init__(self, context, request): 
     self.context = context 
     self.request = request 
     self.form = QuestionSinglePartForm(context, request, self.schema, self.additional) 
     alsoProvides(self.form, IWrappedForm) 

    def magic(self, data, errors): 
     pass 
     """ 
     question = Question() 
     question.number = data['number'] 
     question.questionContent = data['questionContent'] 

     questionPart = QuestionPart() 
     questionPart.typeOfQuestion = data['IQuestionPart.typeOfQuestion'] 
     questionPart.explanation = data['IQuestionPart.explanation'] 
     questionPart.fileSize = data['IQuestionPart.fileSize'] 
     questionPart.fileType = data['IQuestionPart.fileType'] 
     questionPart.hints = data['IQuestionPart.hints'] 
     questionPart.table = data['IQuestionPart.table'] 
     questionPart.contype = data['IQuestionPart.contype'] 
     questionPart.content = data['IQuestionPart.content'] 
     """ 

    def update(self, *args, **kwargs): 
     self.form.update(*args, **kwargs) 
     self.formdisplay = self.form.render() 

    def __call__(self, *args, **kwargs): 
     self.update(*args, **kwargs) 
     return self.index(*args, **kwargs) 
1

Только классы классов, которые включают смешение plone.autoform.base.AutoExtensibleForm, обратите внимание на подсказки схемы. Попробуйте использовать это как примесь к вашей форме группы класса (и указать атрибут schema что Mixin ищет вместо fields):

from plone.autoform.base import AutoExtensibleForm 

class QuestionPart(AutoExtensibleForm, group.Group): 
    label = u'Question Part' 
    schema = IQuestionPart 
    template = ViewPageTemplateFile('questionpart_templates/view.pt') 
+0

Спасибо Давид. При импорте из plone.autoform.base я бы получил ошибку импорта «ImportError: невозможно импортировать имя AutoExtensibleForm».Однако, когда я меняю базу, чтобы ее создать, она работает. Кроме того, я получаю сообщение об ошибке, в котором вопрос не имеет атрибута updateActions. –

Смежные вопросы