Как добавить дополнительные поля (пользовательские капчи) в форму регистрации в Plone 4.1
Я пытаюсь добавить пользовательскую капчу в форму регистрации для моего сайта Plone. Я недавно обновил с 3.1.x до 4.1.3, и это сломало мои существующие настройки для шаблона join_form и сценария проверки.
Я пытался следовать примеруватаме collect.examples.userdata, чтобы выполнить настройку. Я думаю, что правильно следовал примеру, но новое поле не отображается в регистрационной форме.
Как выяснить, почему дополнительные поля не отображаются, и есть ли лучший способ добавить пользовательскую капчу в форму?
Обратите внимание, что я попробовал взглянуть на один из пакетов капчи для Plone 4, но те, на которые я смотрел, казались действительно сложными (в одном из них было разбросано по 3 пакета).
Обновление: по- видимому, использование стокового коллективного файла.examples.userdata также не работает для меня. Я добавлял коллективный файл.examples.userdata и не получаю никаких дополнительных полей в форме регистрации @@.
Кроме того, я использую старый запасной шаблон plone 3, если он имеет значение.
2 ответа
В этом примере используется отличный виджет http://pypi.python.org/pypi/quintagroup.formlib.captcha, но общий подход может применяться во многих других ситуациях.
По сути, вы не хотите определять поле капчи в вашей схеме пользовательских данных; скорее, вы хотите временно добавить его в схему формы при визуализации формы следующим образом:
браузер /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.'
),
)
браузер /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>
Протестировано с использованием colle.examples.userdata и Plone 4.1
Я не знаю лучшего ответа, но он обсуждался на http://comments.gmane.org/gmane.comp.web.zope.plone.user/115264 если вы этого еще не нашли.