如何在Plone 4.1中向注册表中添加额外字段(自定义验证码)

如何在Plone 4.1中向注册表中添加额外字段(自定义验证码),plone,Plone,我正在尝试将自定义验证码添加到我的Plone站点的注册表中。我最近从3.1.x升级到4.1.3,这打破了我对join_表单模板和验证脚本的现有定制 我一直在尝试按照这个例子进行定制。我想我已经正确地遵循了这个示例,但是新字段没有被呈现到注册表中 我如何找出为什么没有显示额外的字段,以及有没有更好的方法向表单中添加自定义验证码 请注意,我确实尝试查看了Plone 4的其中一个验证码包,但我查看的那些包似乎非常复杂(其中一个包的零件散落在3个包中) 更新:显然使用stock collective.e

我正在尝试将自定义验证码添加到我的Plone站点的注册表中。我最近从3.1.x升级到4.1.3,这打破了我对join_表单模板和验证脚本的现有定制

我一直在尝试按照这个例子进行定制。我想我已经正确地遵循了这个示例,但是新字段没有被呈现到注册表中

我如何找出为什么没有显示额外的字段,以及有没有更好的方法向表单中添加自定义验证码

请注意,我确实尝试查看了Plone 4的其中一个验证码包,但我查看的那些包似乎非常复杂(其中一个包的零件散落在3个包中)

更新:显然使用stock collective.examples.userdata对我也不起作用。我添加了collective.examples.userdata,在@@register表单上没有任何其他字段


另外,如果有什么不同,我会使用旧的plone 3回退模板。

我不知道最好的答案,但如果您还没有发现,我们已经在上讨论过。

这个示例使用了优秀的小部件,但一般方法可以应用于许多其他情况

基本上,您不想在用户数据模式中定义captcha字段;相反,在呈现表单时,您希望通过以下方式将其临时添加到表单架构:

浏览器/界面.py

from zope.interface import Interface
from quintagroup.formlib.captcha import Captcha
from my.package import myMessageFactory as _


class IMyRegistrationForm(Interface):
    """Marker interface for my custom registration form
    """


class ICaptchaSchema(Interface):
    captcha = Captcha(
        title=_(u'Verification'),
        description=_(
            u'Type the code from the picture shown below.'
        ),
    )
浏览器/forms.py

from zope.formlib import form
from plone.app.users.browser.register import RegistrationForm
from quintagroup.formlib.captcha import CaptchaWidget
from my.package.browser.interfaces import IMyRegistrationForm, ICaptchaSchema


class MyRegistrationForm(RegistrationForm):
    """ Subclass the standard registration form
    """

    implements(IMyRegistrationForm)

    @property
    def form_fields(self):
        # Get the fields so we can fiddle with them
        myfields = super(MyRegistrationForm, self).form_fields

        # Add a captcha field to the schema
        myfields += form.Fields(ICaptchaSchema)
        myfields['captcha'].custom_widget = CaptchaWidget

        # Perform any field shuffling here...

        # Return the fiddled fields
        return myfields
最后,在浏览器/configure.zcml中注册自定义注册表:

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser"
    i18n_domain="my.package">

  <browser:page
      name="register"
      for="Products.CMFPlone.Portal.PloneSite"
      class=".forms.MyRegistrationForm"
      permission="zope.Public"
      />  

</configure>


使用collective.examples.userdata和Plone 4.1

进行测试,谢谢,但重点是recaptcha。我特别不想使用recaptcha,因为它并不比没有验证码好多少。我有一个自定义的,我升级到4.1之前使用的,我想适应该网站。我在想,既然我需要一个额外的日期字段,我可以使用一个修改过的collective.examples.userdata,但是这个额外的字段没有显示在注册表表上。你能提供你编写的代码的重要部分吗,这样我们就可以看到已经有什么和缺少什么了?Giacomo Spettoli:查看我关于股票的更新collective.examples.userdata不工作。这与我想要的最接近。请注意,我必须将配置添加到collective.examples.userdata/configure.zcml,而不是browser/configure.zcml才能使其工作。它还添加了密码提示,而不是先发送确认电子邮件(这是我想要的)。关于我的最后一条评论,切换@安全控制面板的“安全”选项卡上的“让用户选择自己的密码”设置不会改变任何事情。我想我需要做些别的事情来保持这个设置。啊
myfields=super(RegistrationForm,self)。form\u fields
应该是
myfields=super(MyRegistrationForm,self)。form\u fields
在浏览器/forms.py中。我假设您已经将collective.examples.userdata作为自己的包,并按照惯例将表单浏览器视图代码放在browser/中。