variable template examples django django-forms django-registration

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.