Justin Johnson wrote:
Here's an example of what I did to get a multiple choice select box. It's been a while since I did this so it could probably use some cleanup. But it is working for me.
Here's a cleaned up and modernized version, with an example.
Please explicitly say you are cool with this getting included in nevow -- I'd be happy to file the issue.
# -*- python -*- from twisted.application import service, internet from nevow import compy, rend, inevow, appserver from formless import webform, annotate, iformless import multichoice
ANIMALS = ['dogs', 'cats', 'snakes']
class IAnimals(annotate.TypedInterface): def remember(self, like=multichoice.MultipleChoice(choices=ANIMALS), hate=multichoice.MultipleChoice(choices=ANIMALS)): pass remember = annotate.autocallable(remember)
class Animals(object): __implements__ = IAnimals like = None hate = None
def remember(self, like, hate): self.like = like self.hate = hate print 'REMEMBER', self return self
def __repr__(self): return '<%s like=%r hate=%r>' % ( self.__class__.__name__, self.like, self.hate, )
class MyResource(rend.Page): docFactory = rend.htmlstr( """\ <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://nevow.com/ns/nevow/0.1"> <head> <title>Thingies</title> <link href="/form_css" rel="stylesheet" type="text/css" /> </head> <body> <nevow:invisible nevow:render="input"/> </body> </html> """) child_form_css = webform.defaultCSS
def configurable_(self, context): try: return context.locate(inevow.IHand) except KeyError: return Animals()
def render_input(self, context, data): formDefaults = context.locate(iformless.IFormDefaults) methodDefaults = formDefaults.getAllDefaults('remember') conf = self.locateConfigurable(context, '') methodDefaults['like'] = conf.original.like methodDefaults['hate'] = conf.original.hate print 'RENDER', conf.original return webform.renderForms()
site = appserver.NevowSite(MyResource()) application = service.Application("multichoice-example") webServer = internet.TCPServer(8080, site) webServer.setServiceParent(application)