2012-03-21 10 views
5

Plone sitelerimden birinde, harf oluşturmak için kullandığım birkaç el becerisi modelim var. Modeller: "Model" (mektubun temel içeriği), "İletişim" (isim, adres vb. Gibi iletişim bilgilerini içeren) ve "Birleştirme" (bu, bazılarının yerini aldığımız bir Model nesnesidir). alıcı bilgileri ile modelin kısımları). "Birleştirme" nesnenin şema aşağıdadır:Plone ve Dexterity: "ilişki" alanı için varsayılan değerler

class IMergeSchema(form.Schema): 
    """ 
    """ 
    title = schema.TextLine(
     title=_p(u"Title"), 
     ) 

    form.widget(text='plone.app.z3cform.wysiwyg.WysiwygFieldWidget') 
    text = schema.Text(
     title=_p(u"Text"), 
     required=False, 
     ) 

    form.widget(recipients=MultiContentTreeFieldWidget) 
    recipients = schema.List(
     title=_('label_recipients', 
       default='Recipients'), 
     value_type=schema.Choice(
      title=_('label_recipients', 
         default='Recipients'), 
      # Note that when you change the source, a plone.reload is 
      # not enough, as the source gets initialized on startup. 
      source=UUIDSourceBinder(portal_type='Contact')), 
     ) 

    form.widget(model=ContentTreeFieldWidget) 
    form.mode(model='display') 
    model = schema.Choice(
     title=_('label_model', 
        default='Model'), 
     source=UUIDSourceBinder(portal_type='Model'), 
     ) 

nesne, ben "Alıcıları" alanları klasöründe bulunan tüm kişiler ile önceden ayarlanabilir olması istiyorum "Birleştirme" yeni bir yaratma nerede yeni nesne oluşturuldu. Bir alan için varsayılan değer eklemek için Martin Aspelli'nin rehberini takip ettim: http://plone.org/products/dexterity/documentation/manual/developer-manual/reference/default-value-validator-adaptors

Metin giriş alanları için iyi çalışıyor, ancak "alıcılar" alanı için çalışamıyorum. Varsayılan değerleri üretmek için yöntem şudur (çirkin baskı ile bazı hata ayıklama bilgi ile, ancak daha sonra kaldırılır;)):

@form.default_value(field=IMergeSchema['recipients']) 
def all_recipients(data): 
    contacts = [x for x in data.context.contentValues() 
       if IContact.providedBy(x)] 
    paths = [u'/'.join(c.getPhysicalPath()) for c in contacts] 
    uids = [IUUID(c, None) for c in contacts] 

    print 'Contacts: %s' % contacts 
    print 'Paths: %s' % paths 
    print 'UIDs: %s' % uids 

    return paths 

Ben, doğrudan kendi göreli yol nesneleri döndürmek için çalıştı (içinde görünüm ekle, "self.widgets ['alıcılar']." değerine "erişirken, bu tür veriyi alırken) UID'lerini kullanırken herhangi bir etki olarak çözümden hiçbiri.

Ayrıca listeler veya hatta jeneratörler yerine tuple döndürmeyi denedim, ancak yine de hiçbir etkisi olmayacak.

Örnek günlüğündeki izleri gördüğümden yöntem kesin olarak çağrılır.

cevap

3

İlgili içeriğin "int_id" ini almanız gerektiğini düşünüyorum. Bu şekilde maharet ilişkisi alanları ilişki bilgisini saklar. ::

from zope.component import getUtility 
from zope.intid.interfaces import IIntIds 

@form.default_value(field=IMergeSchema['recipients']) 
def all_recipients(data): 
    contacts = [x for x in data.context.contentValues() 
       if IContact.providedBy(x)] 
    intids = getUtility(IIntIds) 
    # The following gets the int_id of the object and turns it into 
    # RelationValue 
    values = [RelationValue(intids.getId(c)) for c in contacts] 

    print 'Contacts: %s' % contacts 
    print 'Values: %s' % values 

    return values 
İlgili konular