首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建具有多个模式的z3c.form?

如何创建具有多个模式的z3c.form?
EN

Stack Overflow用户
提问于 2014-12-05 23:53:21
回答 2查看 137关注 0票数 2

我正在使用cms Plone构建一个包含另外两个模式的表单。

使用群形,我已经能够包含这两个模式的两个字段。但是,当我使用datagridfield构建表时,它们会丢失所有属性,比如隐藏属性。我想要做的是让这两个表单都有它们的字段,并且在保存时能够将它们保存在链接被单击为父->对象1的对象中,该对象位于窗体的->对象2底部。

下面是我的python代码:

代码语言:javascript
复制
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小部件。我找到了一种用字段提示显示正确表单的方法。

代码语言:javascript
复制
class QuestionSinglePart(AutoExtensibleForm, form.AddForm):
    grok.require('zope2.View')
    grok.context(ISiteRoot)

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

我觉得我还有很长的路要走。我和一些人谈过了。我现在尝试使用单独的表单和视图。

到目前为止,我的代码是:

代码语言:javascript
复制
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对象没有索引属性。

经过几个小时的工作与一些开发人员,我们已经弄清楚了发生了什么。

我忽略了:

代码语言:javascript
复制
    @property
    def schema(self):
        return self._schema

我需要在视图中定义如下索引:

代码语言:javascript
复制
index = ViewPageTemplateFile('questionsinglepart_templates/questionsinglepart.pt')

我需要将它添加到视图init中。

代码语言:javascript
复制
alsoProvides(self.form, IWrappedForm)

在视图的update方法中,我需要在格式显示之前调用它。我还可以删除数据提取并将其移动到表单中。

代码语言:javascript
复制
def update(self, *args, **kwargs):
    self.form.update(*args, **kwargs)
    self.formdisplay = self.form.render()

我目前仍在努力将数据保存到对象中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-16 20:14:09

这是我的最后一段代码,上面做了一些修改。对象的索引存在问题。我需要创建一个简单的自定义视图。我忘记了表单上模式的属性。我还需要更改视图的更新方法。

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2014-12-08 00:51:49

只有包含plone.autoform.base.AutoExtensibleForm混联的表单类才会注意模式表单提示。尝试将其用作Group类的混合器(并提供此混合器所寻找的schema属性,而不是fields):

代码语言:javascript
复制
from plone.autoform.base import AutoExtensibleForm

class QuestionPart(AutoExtensibleForm, group.Group):
    label = u'Question Part'
    schema = IQuestionPart
    template = ViewPageTemplateFile('questionpart_templates/view.pt')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27326572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档