Добавление дополнительных полей в форму регистрации django - PullRequest
6 голосов
/ 25 февраля 2011

У меня есть модель под названием «Организация», которую я настроил в качестве профиля пользователя, и я хотел бы, чтобы поля модели «Организация» отображались на странице регистрации. Как мне сделать это с помощью 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 ]

6 голосов
/ 28 сентября 2011

Самый простой способ сделать это - [проверено на 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'])

Затем в вашем корневом urlconf [но выше шаблона регулярного выражения, включающего registration.urls и предполагая, что регулярное выражение равно r'^accounts/'], добавьте:

from organization.forms import CustomRegistrationForm

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

Очевидно, вы также можете создать пользовательский бэкэнд , но ИМХО, это намного проще.

2 голосов
/ 26 февраля 2011

Лучшим способом было бы создать в приложении, где у вас есть Organization файл (скажем, "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. Он также скажет регистрации использовать вашу форму, а не свою собственную. Я пропустил много проверок здесь (и, возможно, вывод пользовательского объекта ... если это так, перейдите к исходному коду регистрации и посмотрите, откуда он), но это определенно правильный путь несколько вещей на странице с минимальными усилиями с вашей стороны.

1 голос
/ 26 августа 2012

Измените код, как показано ниже, и повторите попытку

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

)

0 голосов
/ 08 августа 2013

"Ранее предполагалось, что в форме, используемой для сбора данных при регистрации, был реализован метод save (), который создавал бы новую учетную запись пользователя. Это уже не так; создание учетной записи обрабатывается бэкэндом, и поэтому любой пользовательская логика должна быть перенесена в пользовательскую бэкэнд или путем подключения слушателей к сигналам, отправляемым в процессе регистрации. "

Детали:

больше информации можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...