2011-02-25 35 views
5

Tengo un modelo llamado "Organización" que he configurado como perfil de usuario y me gustaría que los campos del modelo "Organización" aparezcan en la página de registro. ¿Cómo hago esto con django-registration?Adición de campos adicionales al formulario de registro django

# 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' 

Respuesta

2

La mejor manera sería la creación de la aplicación en la que tiene Organización un archivo (por ejemplo, "forms.py"), y hacer esto:

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) 

Y luego, en sus URL de base , anular la URL existente para el registro, y añadir esta forma como su forma de usar:

form organization.forms import RegistrationFormWithOrganization 

url('^/registration/register$', 'registration.views.register', 
    {'form_class': RegistrationFormWithOrganization}), 
url('^/registration/', include('registration.urls')), 

Recuerde que Django usará la primera URL que coincide con la expresión regular, por lo que coincidirá con su llamada y no django-registro de. También le dirá al registro que use su formulario, no el suyo. Me salté mucha validación aquí (y, probablemente, la derivación del objeto de usuario ... si es así, ve a leer el código fuente para ver de dónde viene), pero esta es definitivamente la ruta correcta para obtener algunas cosas en la página con un mínimo esfuerzo de su parte.

+0

Esto no funcionaría porque (a) 'RegistrationForm' no tiene un campo' user', por lo que el 'self.cleaned_data [ 'usuario'] 'lanzará una excepción' KeyError'; (b) Necesita un objeto 'Usuario' para crear un objeto' Organización', y no lo obtendrá hasta que llame a 'RegistrationForm.save' que devuelve el objeto' user' recién creado. Por favor vea mi respuesta para una solución alternativa. –

+0

@SimonKagwi He utilizado su respuesta, pero sigo recibiendo este error: TypeError at/accounts/register/ register() toma al menos 2 argumentos no palabras clave (1 dado) – anc1revv

6

La forma más sencilla de hacerlo sería [probado en django-registration 0,8]:

En algún lugar de su proyecto, dicen forms.py en su aplicación organización

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']) 

Luego, en la raíz de su urlconf [pero por encima del patrón de expresión regular que incluye registration.urls y suponiendo que la expresión regular es r'^accounts/'] agregar:

from organization.forms import CustomRegistrationForm 

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

Obviamente, también puede create a custom backend, pero en mi humilde opinión esto es mucho más fácil.

+0

sigo recibiendo este error: register() toma al menos 2 argumentos que no son palabras clave (1 dado). – anc1revv

+0

Esto se debe a las diferentes versiones de django-registration. Creo que hizo una reescritura con 0.8. –

1

Modificar el código que a continuación y vuelve a intentarlo

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

)

+0

@ anc1rew Pruebe este y vea si funciona – flexxxit

+0

Eso lo solucionó, gracias. – Jonah

0

"Anteriormente, el formulario de recogida de datos durante el registro se esperaba para poner en práctica un método save() que crearía el nuevo usuario cuenta. Ya no es el caso, la creación de la cuenta es manejada por el backend, por lo que cualquier lógica personalizada debe moverse a un servidor personalizado , o conectando oyentes a las señales enviadas durante el proceso de registro ".

Detalles:

información se puede encontrar más here

Cuestiones relacionadas