在django-registration表单中添加额外字段

6 投票
4 回答
6131 浏览
提问于 2025-04-16 12:33

我有一个叫“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}),
)

显然,你也可以 创建一个自定义后端,但在我看来,这样做要简单得多。

撰写回答