template - Python/Django django-registration agrega un campo adicional
django template variable (2)
He leído mucho sobre cómo agregar un campo adicional al usar Django-registration, por ejemplo aquí , aquí y aquí . Los fragmentos de código son: forms.py (desde la aplicación de registro)
class RegistrationForm(forms.Form):
username = forms.RegexField(regex=r''^/w+$'', max_length=30, widget=forms.TextInput(attrs=attrs_dict), label=_("Username"), error_messages={ ''invalid'': _("This value must contain only letters, numbers and underscores.") })
email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=75)), label=_("Email"))
password1=forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False), label=_("Password"))
institute=forms.CharField(max_length=50) #This is the new!
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False), label=_("Password (again)"))
captcha = CaptchaField()
Utilizo el método de guardado de registro de django, que está en el backend predeterminado:
def register(self, request, **kwargs):
username, email, password = kwargs[''username''], kwargs[''email''], kwargs[''password1'']
if Site._meta.installed:
site = Site.objects.get_current()
else:
site = RequestSite(request)
new_user = RegistrationProfile.objects.create_inactive_user(username, email,
password, site)
signals.user_registered.send(sender=self.__class__,
user=new_user,
request=request)
return new_user
En models.py he creado una nueva clase:
class UserProfile(models.Model):
user = models.OneToOneField(User)
institute=models.CharField(max_length=50)
def create_user_profile(sender, instance, created, **kwargs):
if created:
profile, created = UserProfile.objects.get_or_create(user=instance)
post_save.connect(create_user_profile, sender=User)
En el admin.py:
admin.site.unregister(User)
class UserProfileInline(admin.StackedInline):
model = UserProfile
class UserProfileAdmin(UserAdmin):
inlines = [ UserProfileInline, ]
admin.site.register(User, UserProfileAdmin)
No he alterado nada más. Cuando presento el formulario, puedo ver el campo del Instituto que he agregado. Cuando estoy en el sitio de administración, puedo ver el perfil de usuario de cada usuario. Sin embargo, nada se guarda allí cuando creo un nuevo usuario, mientras que los otros detalles del usuario se guardan normalmente. Creo que necesito algún tipo de configuración, pero ¿dónde? ¿Tal vez en los archivos de la aplicación de registro de Django?
Además de la respuesta de Garrett, recibí el error "no puedo importar el nombre del registro" con django-registration versión 0.8. Creo que esto se debe a las vistas basadas en clases, por lo que actualice urls.py
consecuencia:
from django.conf.urls import patterns, include, url
from registration.backends.default.views import RegistrationView
from abby.apps.accounts.forms import UserRegForm
urlpatterns = patterns('''',
url(r''^register/$'', RegistrationView.as_view(form_class=UserRegForm)),
)
He encontrado una solución a este problema, y lo publicaré aquí en caso de que alguien pueda usarlo. Es bastante simple, supongo.
Paso 1 Agregue un nuevo modelo, que será un perfil, en models.py:
#models.py
class user_profile(models.Model):
user=models.ForeignKey(User, unique=True)
institution=models.CharField(max_length=200)
def __unicode__(self):
return u''%s %s'' % (self.user, self.institution)
Paso 2 Crea el formulario que usará este modelo:
#forms.py
from registration.forms import RegistrationForm
from django.forms import ModelForm
from Test.models import user_profile
class UserRegForm(RegistrationForm):
institution=forms.CharField(max_length=200)
Paso 3 Crea ragbackend.py y define cómo se guardarán los datos:
from Test.models import user_profile
from forms import *
def user_created(sender, user, request, **kwargs):
form = UserRegForm(request.POST)
data = user_profile(user=user)
data.institution = form.data["institution"]
data.save()
from registration.signals import user_registered
user_registered.connect(user_created)
Paso 4 Vaya a urls.py y realice los siguientes cambios:
import regbackend
from registration.views import register
url(r''^accounts/register/$'', register, {''backend'': ''registration.backends.default.DefaultBackend'',''form_class'': UserRegForm}, name=''registration_register''),
(r''^accounts/'', include(''registration.urls'')),
Tenga en cuenta que debe colocar las URL en ese orden. Fácil de entender por qué.
Paso 5 Ahora todo funciona, pero no puede ver la información en el sitio de administración. Entonces debes ir a admin.py y agregar:
#admin.py
from django.contrib.auth.models import User
from Test.models import user_profile
admin.site.unregister(User)
class UserProfileInline(admin.StackedInline):
model = user_profile
class UserProfileAdmin(UserAdmin):
inlines = [ UserProfileInline, ]
admin.site.register(User, UserProfileAdmin)
Y eso es. No olvides el syncdb
before runserver
. Espero que esto ayude a alguien.