2010-08-19 23 views
33

Estoy tratando de implementar el Registro de usuario para mi aplicación Django. El libro que leí menciona UserCreationForm, pero necesito algo más que el nombre, la contraseña y la dirección de correo electrónico. Podría implementar mi propio objeto de usuario y usar ModelForm, creo, pero luego pierdo algunas de las ventajas de django para la autenticación. Finalmente, he leído algo sobre UserProfiles que complementan a los usuarios, supongo, así que creo que necesito una combinación de todas estas cosas. Esto es lo que tengo hasta ahora.La mejor manera de registrar un usuario en Django

Ver - esto es bastante simple. Todo lo que quiero hacer aquí es crear mi formulario y guardar el usuario

def main(request): 
    rform1 = forms.RegisterForm1() 
    rform2 = forms.RegisterForm2() 
    return render_to_response("authentication/index.html", {'form1': rform1, 'form2':rform2}) 

def register(request): 
    if request.method == 'POST': 
     rform1 = forms.RegisterForm1(request.POST) 
     rform2 = forms.RegisterForm2(request.POST) 
     if rform1.is_valid() and rform2.is_valid(): 
      new_user = rform1.save() 
      return HttpResponseRedirect("/register-success/") 
    return render_to_response("authentication/index.html", {'form1': rform1,'form2':rform2}) 

Formulario - este es mi formulario para crear un usuario. O al inicio al menos

class RegisterForm1(forms.ModelForm): 
    class Meta: 
     model = User 

class RegisterForm2(forms.ModelForm): 
    class Meta: 
     model = UserProfile 

Modelo: este es mi perfil de usuario con el que deseo complementar al usuario.

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    phonenumber = PhoneNumberField() 

¿Está claro lo que estoy tratando de hacer? ¿Estoy en el camino correcto

Respuesta

29

a hacer formas dos modelos, uno para el modelo User y uno para el modelo UserProfile.

class UserForm(django.forms.ModelForm): 
    class Meta: 
     model = User 

class UserProfileForm(django.forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     exclude = ['user'] 

Dales los prefijos y los muestra juntos en el mismo elemento de formulario HTML. En la vista, verifique que ambos sean válidos antes de guardar el usuario y luego el perfil de usuario.

def register(request): 
    if request.method == 'POST': 
     uf = UserForm(request.POST, prefix='user') 
     upf = UserProfileForm(request.POST, prefix='userprofile') 
     if uf.is_valid() * upf.is_valid(): 
      user = uf.save() 
      userprofile = upf.save(commit=False) 
      userprofile.user = user 
      userprofile.save() 
      return django.http.HttpResponseRedirect(…something…) 
    else: 
     uf = UserForm(prefix='user') 
     upf = UserProfileForm(prefix='userprofile') 
    return django.shortcuts.render_to_response('register.html', 
               dict(userform=uf, 
                userprofileform=upf), 
               context_instance=django.template.RequestContext(request)) 

En register.html:

<form method="POST" action=""> 
    {% csrf_token %} 
    {{userform}} 
    {{userprofileform}} 
    <input type="submit"> 
</form> 
+0

edité mi código. Creo que me estoy acercando. ¡Gracias! – JPC

22

que solo estaba buscando en esto, y descubrió que Django tiene una muy simple incorporado nueva forma de creación de usuario, que se puede utilizar si desea simple registro - no hay opción para, por ejemplo, guardar una dirección de correo electrónico y validarla, por lo que no funcionará para el caso de uso del OP, pero la estoy publicando aquí en caso de que otros encuentren esta pregunta como lo hice, y estoy buscando algo sencillo.

Si lo que desea es que la gente sea capaz de elegir un nombre de usuario y contraseña, luego los muebles empotrados harán todo lo posible para usted, incluyendo la validación y guardar el nuevo usuario:

from django.views.generic.edit import CreateView 
from django.contrib.auth.forms import UserCreationForm 

urlpatterns = patterns('', 
    url('^register/', CreateView.as_view(
      template_name='register.html', 
      form_class=UserCreationForm, 
      success_url='/' 
    )), 
    url('^accounts/', include('django.contrib.auth.urls')), 

    # rest of your URLs as normal 
) 

Así que la única lo que tiene que hacer usted mismo es crear register.html ...

Más información aquí: http://www.obeythetestinggoat.com/using-the-built-in-views-and-forms-for-new-user-registration-in-django.html

+0

¿Algún recurso sobre cómo crear el register.html? – Tunisia

+0

@Tunisia jsut crea una plantilla y representa el 'formulario', al igual que para el ejemplo de formulario de inicio de sesión en los documentos. –

Cuestiones relacionadas