Returning field widget from (Collection) loop

If I have a (Collection) view:

Is it possible to return the widget (render values) from a loop?

I want to use Javascript sourced data for DataTables (since it is faster than),

If I just return the fields I get creator username instead of 'Fullname' and same problem with related items, vocabularies, images etc.

Or am I missing something here?

Did you ever find a solution?

No, I ended up doing a check of type, for example:

    <span tal:condition="python: field['row_field'] in ['initial_due_date', 'duedate']">
    <time class="pat-display-time" 
    tal:condition="val"    datetime="${python:val.isoformat()}"    
    data-pat-display-time="output-format: Do MMMM YYYY">${val}
    </time>
    </span>

I went deep on this (maybe too deep)…

Plone 5.2

./helpers.py

from plone.app.contentlisting.catalog import CatalogContentListingObject
from plone.dexterity.browser.view import DefaultView
from plone.memoize.view import memoize
from zope.interface import implementer


class WidgetListingObject(CatalogContentListingObject):
    """Wrap a CatalogContentListingObject and add widgets."""

    def __init__(self, brain, request):
        self._brain = brain
        self.request = request

    def getObject(self):
        return self._brain.getObject()

    @property
    @memoize
    def widgets(self):
        obj = self.getObject()
        view = DefaultView(obj, self.request)
        view.update()
        return [w for name, w in view.widgets.items()]
./browser/views.py

from ..helpers import WidgetListingObject
from plone.app.contenttypes.browser.collection import CollectionView


class ItemFieldsView(CollectionView):
    """returns a collection full item view that includes widgets"""

    @property
    def full_items(self):
        brains = self.results()
        log.info(brains)
        return [WidgetListingObject(brain, self.request) for brain in brains]


register the view

./browser/configure.zcml

  <browser:page
        name="collection_partners_view"
        title="Collection Partners View"
        menu="plone_displayviews"
        permission="zope2.View"
        layer="..interfaces.IPnzWwwPnzDeLayer"
        for="plone.app.contenttypes.interfaces.ICollection"
        class=".views.ItemFieldsView"
        template="templates/collection_partners_view.pt"
        />

and then in the TAL template you can do:

    <tal:itemsloop tal:repeat="item full_items">
        <tal:loop tal:repeat="widget item/widgets">
            <div tal:condition="widget/value" tal:content="structure widget/@@ploneform-render-widget">widget</div>
        </tal:loop>
    </tal:itemsloop>

to leverage your schema:

./content/partner.py

[..]
    partner_phone = schema.TextLine(
        title=_(
            'partner_phone_title',
            default='Company Phone',
        ),
        required=False,
        constraint=validate_phonenumber,
    )
    directives.widget('partner_phone', PhoneNumberFieldWidget, klass="partner-contact-item")