6

我有一个名为“组织”的模型,我已将其设置为用户配置文件,我希望“组织”模型中的字段显示在注册页面上。我该如何使用 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

4 回答 4

6

最简单的方法是[在django-registration0.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'])

registration.urls然后在您的根 urlconf [但在包含并假设正则表达式为的正则表达式模式之上r'^accounts/'] 添加:

from organization.forms import CustomRegistrationForm

urlpatterns += patterns('',
    (r'^accounts/register/$', 'registration.views.register',    {'form_class':CustomRegistrationForm}),
)

显然,您也可以创建自定义后端,但恕我直言,这更容易。

于 2011-09-28T09:13:24.600 回答
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 的。它还会告诉注册使用您的表单,而不是它自己的表单。我在这里跳过了很多验证(可能还有用户对象的派生......如果是这样,请阅读注册源代码以查看它的来源),但这绝对是正确的途径只需您花费最少的精力,即可在页面中添加一些内容。

于 2011-02-25T22:14:24.533 回答
1

修改代码如下再试一次

urlpatterns += patterns('',
(r'^accounts/register/$', 'registration.views.register',    {'form_class':CustomRegistrationForm,'backend': 'registration.backends.default.DefaultBackend'}),

)

于 2012-08-26T15:38:58.153 回答
0

“以前,用于在注册期间收集数据的表单预计会实现一个 save() 方法,该方法将创建新的用户帐户。现在情况不再如此;创建帐户由后端处理,因此任何自定义逻辑都应该移动到自定义后端,或者通过将侦听器连接到注册过程中发送的信号。”

细节:

更多信息可以在这里找到

于 2013-08-07T20:57:07.020 回答