2016-12-19 5 views
1

J'écris ce code pour Dextérité dans Plone 4, le code est simple, cependant, il provoque une certaine erreur, ci-dessous nous voyons le code et ensuite une image de l'erreur, là, je explique ce que j'ai fait.Comment je fixe dans Dextérité Plone 4 erreur dans le schéma?

from plone.autoform import directives 
from plone.namedfile import field as namedfile 
from plone.supermodel import model 
from z3c.form.browser.radio import RadioFieldWidget 
from zope import schema 
from zope.interface import invariant, Invalid 
from zope.schema.vocabulary import SimpleVocabulary 
from zope.schema.vocabulary import SimpleTerm 
from datetime import datetime 

from projetime.ged import _ 

VocabularyDocumentType = SimpleVocabulary(
    [SimpleTerm(value=u'lawsuits', title=_(u'Lawsuits')), 
    SimpleTerm(value=u'contracts', title=_(u'Contracts')), 
    SimpleTerm(value=u'another', title=_(u'Another Docs'))] 
) 

def nowDateTime(): 
    return datetime.today() 

class IDigitalFile(model.Schema): 
    """Dexterity-Schema 
    """ 

    directives.widget(documentType=RadioFieldWidget) 
    documentType = schema.Choice(
     title=_(u"Document Type"), 
     vocabulary=VocabularyDocumentType, 
     required=True, 
    ) 

    documentCod = schema.TextLine(
     title=_(u"Document Cod."), 
     description=_(u"The Document Cod must be have xxxx/yyyy"), 
     required=False, 
    ) 

    identification = schema.TextLine(
     title=_(u"Identification"), 
     description=_(u"Enter your indetification"), 
     min_length = 11, 
     required=False, 
    ) 

    subject = schema.TextLine(
     title=_(u"Subject"), 
     required=True, 
    ) 

    typeOf = schema.TextLine(
     title=_(u"Type of Document"), 
     required=False, 
    ) 

    file = namedfile.NamedBlobFile(
     title=_(u"Digital Archive"), 
     required=True, 
    ) 

    directives.mode(auto="hidden") 
    auto = schema.Bool(
     title=_(u"Upload via Script?"), 
     required=True, 
     default=False, 
    ) 


    @invariant 
    def DocumentTypeInvariant(data): 
     if data.documentType == 'lawsuits': 
      if not data.documentCod or not data.identification or not data.typeOf or not data.Description: 
       raise Invalid(_(u"You choose Lawsuits, all fields are required!")) 
     elif data.documentType == 'contracts': 
      if not data.documentCod or not data.identification or not data.Description: 
       raise Invalid(_(u"You choose Contracts, All fields with EXCEPTION of Type of Document are required")) 

Quand je vais créer dans Plone l'objet appelé DigitalFile, je commence à remplir les champs, lorsque tous les champs sont remplis, je cette erreur avant de cliquer sur soumettre:

Module projetime.ged.content.digitalfile, line 87, in DocumentTypeInvariantModule; z3c.form.validator, line 164, in __getattr__;AttributeError: Description

Comment Je le répare?

Répondre

2

Le invariant est défini dans le schema et le champ est Descriptionpas dans ce schéma, donc vous ne pouvez pas y accéder à l'invariant.

Vous avez besoin de quelque chose qui prenne en compte, que le champ Description soit défini dans un schéma différent.

Vous pouvez résoudre votre problème avec un Form validator: http://docs.plone.org/develop/addons/schema-driven-forms/customising-form-behaviour/validation.html#validating-in-action-handlers

Pour cela, vous devez vous enregistrer un formulaire modifier/ajouter des instructions: Check: http://docs.plone.org/external/plone.app.dexterity/docs/advanced/custom-add-and-edit-forms.html

Tout cela est très bien documenté, pour plone 4 et plone 5.

+0

Je suppose que 'IDublinCore.description' Dans le code ci-dessus, il a été appelé par' data.Description' comme nous le faisons dans le modèle de page. Dans ce cas, je veux faire la description requise lorsque sélectionné «poursuites» ou «contrats». –

+0

Vous avez toutes les données de formulaire dans Form-validator, mais vous avez un invariant, qui est collé au schéma que vous avez défini. 'data' dans l'invariant n'est pas la même chose que' data' dans le validateur de formulaire. Vous devez utiliser un validateur de formulaire. – Mathias

+0

Ceci est nouveau pour moi, parce que je suis débutant en développement. Ces codes de 'edit/add form' seront placés dans un autre fichier de structure ou dans le même fichier que celui que j'écris dans' content/digitafile.py'? –