在django-registration表单中添加额外字段
我有一个叫“Organization”的模型,它被设置成用户的个人资料。我想把“Organization”模型里的字段显示在注册页面上。我该如何在django-registration中实现这个呢?
# models.py
class Organization(models.Model):
user = models.ForeignKey(User, unique=True)
logo = models.ImageField(upload_to='organizations')
name = models.CharField(max_length=100, null=True, unique=True)
# more fields below etc.
# settings.py
AUTH_PROFILE_MODULE = 'volunteering.organization'
4 个回答
1
请按照下面的代码进行修改,然后再试一次。
urlpatterns += patterns('',
(r'^accounts/register/$', 'registration.views.register', {'form_class':CustomRegistrationForm,'backend': 'registration.backends.default.DefaultBackend'}),
)
2
最好的方法是在你有组织的应用里创建一个文件(比如叫“forms.py”),然后这样做:
from registration.forms import RegistrationForm
from forms import *
from models import Organization
class RegistrationFormWithOrganization(RegistrationForm):
organization_logo = field.ImageField()
organization_name = field.CharField()
def save(self, profile_callback = None):
Organization.objects.get_or_create(user = self.cleaned_data['user'],
logo = self.cleaned_data['organization_logo'],
name = self.cleaned_data['organization_name'])
super(RegistrationFormWithOrganization, self).save(self, profile_callback)
接着在你的基础URL里,覆盖掉原来的注册URL,并把这个表单设置为你要使用的表单:
form organization.forms import RegistrationFormWithOrganization
url('^/registration/register$', 'registration.views.register',
{'form_class': RegistrationFormWithOrganization}),
url('^/registration/', include('registration.urls')),
记住,Django会使用第一个匹配正则表达式的URL,所以它会匹配你的调用,而不是django-registration的。它还会告诉注册使用你的表单,而不是它自己的。我这里省略了很多验证步骤(还有可能用户对象的生成……如果你想了解,可以去看看注册的源代码,看看它是怎么来的),但这绝对是让你以最小的努力把一些东西放到页面上的正确方向。
6
最简单的方法是这样做的 [在 django-registration
0.8 上测试过]:
在你的项目中的某个地方,比如在你组织的应用的 forms.py 文件里
from registration.forms import RegistrationForm
from django.forms import ModelForm
from models import Organization
class OrganizationForm(forms.ModelForm):
class Meta:
model = Organization
RegistrationForm.base_fields.update(OrganizationForm.base_fields)
class CustomRegistrationForm(RegistrationForm):
def save(self, profile_callback=None):
user = super(CustomRegistrationForm, self).save(profile_callback=None)
org, c = Organization.objects.get_or_create(user=user, \
logo=self.cleaned_data['logo'], \
name=self.cleaned_data['name'])
然后在你的根 URL 配置中 [但要在包含 registration.urls
的正则表达式模式之上,假设这个正则表达式是 r'^accounts/'
] 添加:
from organization.forms import CustomRegistrationForm
urlpatterns += patterns('',
(r'^accounts/register/$', 'registration.views.register', {'form_class':CustomRegistrationForm}),
)
显然,你也可以 创建一个自定义后端,但在我看来,这样做要简单得多。