В этом примере используется отличный виджет quintagroup.formlib.captcha , но общий подход может применяться ко многим другим ситуациям.
По сути, вы не хотите определять поле капчи вваша схема данных пользователя;скорее, вы хотите временно добавить его в схему формы при визуализации формы следующим образом:
browser / interfaces.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.'
),
)
browser / 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
Наконец, зарегистрируйте свою пользовательскую регистрационную форму в browser / 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>
Протестировано с использованием fellow.examples.userdata и Plone 4.1
.