【发布时间】:2013-01-17 19:08:09
【问题描述】:
我正在尝试扩展 Django 注册以包含我自己的注册表单。原则上这是相当简单的。我只需要编写自己的表单 (CustomRegistrationForm),它是原始表单 (RegistrationForm) 的子表单。然后我可以使用 django 注册的 user_registered 信号来处理我的特定输入。
这就是我所做的:
urls.py:
from django.conf.urls import patterns, include, url
from registration.views import register
from forms import CustomRegistrationForm
from django.contrib import admin
import regbackend
admin.autodiscover()
urlpatterns = patterns('',
url(r'^register/$', register, {'backend': 'registration.backends.default.DefaultBackend', 'form_class': CustomRegistrationForm, 'template_name': 'custom_profile/registration_form.html'},
name='registration_register'),
)
regbackend.py:
from django import forms
from models import UserProfile
from forms import CustomRegistrationForm
def user_created(sender, user, request, **kwargs):
form = CustomRegistrationForm(data=request.POST, files=request.FILES)
if form.is_valid(): # HERE: always fails
user_profile = UserProfile()
user_profile.user = user
user_profile.matriculation_number = form.cleaned_data['matriculation_number']
user_profile.save()
from registration.signals import user_registered
user_registered.connect(user_created)
forms.py:
from models import UserProfile
from django import forms
from registration.forms import RegistrationForm
from django.utils.translation import ugettext_lazy as _
attrs_dict = {'class': 'required'}
class CustomRegistrationForm(RegistrationForm):
matriculation_number = forms.CharField(widget=forms.TextInput(attrs=attrs_dict),
label=_("Matriculation number"),
max_length=12,
error_messages={'invalid': _("This value has to be unique and may contain only numbers.")},
initial=108)
def clean_matriculation_number(self):
print "Validating matriculation number."
data = self.cleaned_data['matriculation_number']
if len(data) != 12:
raise forms.ValidationError(_("Matriculation number consists of exactly 12 digits."))
return data
所以问题出在is_valid() 函数上,因为它总是返回False。即使没有错误!那么有什么问题呢?我花了几个小时在这个上,我不知道了:(
非常感谢任何帮助!
【问题讨论】:
-
为什么表单需要
files=request.FILES? -
is_valid只会在出现任何错误时返回False。您未显示的字段可能存在错误。或者根本不显示错误。使用django-debug-toolbar检查表单错误(或自己进行深度检查)。 -
@ Abid:我添加了 files=request.FILES 以避免未绑定的表单或其他东西。起初我只使用了 line form = CustomRegistrationForm(request.POST) 并且它不起作用。 @bouke:我正在使用工具栏,并明确检查了错误。没有了。有趣的是,如果我跳过 is_valid() 函数并使用 form.data[...] 而不是cleaned_data,eerythin 就可以工作。所以验证肯定有问题:/
标签: django forms signals registration