2010-08-19 12 views
33

Ich versuche, Benutzerregistrierung für meine Django App zu implementieren. Das Buch, das ich gelesen habe, erwähnt UserCreationForm, aber ich brauche mehr als nur Name, Passwort und E-Mail-Adresse. Ich könnte mein eigenes Benutzerobjekt implementieren und ModelForm verwenden, denke ich, aber dann verliere ich einige der django Bequemlichkeiten für die Authentifizierung. Schließlich lese ich etwas über UserProfiles, die Benutzer, denke ich, ich denke, ich brauche eine Kombination all dieser Dinge. Hier ist, was ich bisher habe.Die beste Möglichkeit, einen Benutzer in Django zu registrieren

Ansicht - das ist einfach genug. Alles, was ich hier tun möchte, ist mein Formular zu erstellen und den Benutzer zu speichern

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}) 

Formular - das ist meine Form zum Erstellen eines Benutzers. Oder der Anfang davon mindestens

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

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

Modell - das ist mein UserProfile, das ich mit Benutzer ergänzen möchte.

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

Ist es klar, was ich versuche zu tun? Bin ich auf dem richtigen Weg

Antwort

29

Fabrikat zwei Modellformen, eine für das User Modell und ein für das UserProfile Modell.

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

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

Geben Sie ihnen Präfixe und zeigen Sie sie zusammen im selben HTML-Formularelement an. Überprüfen Sie in der Ansicht, dass beide Werte gültig sind, bevor Sie den Benutzer und anschließend das Benutzerprofil speichern.

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

In register.html:

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

ich meinen Code bearbeitet. Ich denke, ich komme näher. Vielen Dank! – JPC

22

Ich war gerade in diese suchen, und fand heraus, dass Django eine sehr einfache verfügt über eine integrierte in neuen Benutzererstellung Form, die Sie verwenden können, wenn Sie einfache Registrierung möchten - Es gibt keine Möglichkeit, zB eine E-Mail-Adresse zu speichern und zu validieren, so dass es nicht für den Anwendungsfall des OPs funktioniert, sondern es hier posten, falls andere wie ich auf diese Frage stoßen und etwas suchen einfach.

Wenn Sie nur die Menschen wollen in der Lage sein, einen Benutzernamen und ein Passwort zu wählen, dann die Einbauten für Sie, einschließlich der Validierung alles tun und speichern den neuen Benutzer:

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 
) 

So ist die einzige was Sie selbst tun müssen, ist register.html ... hier

Weitere Daten erstellen: http://www.obeythetestinggoat.com/using-the-built-in-views-and-forms-for-new-user-registration-in-django.html

+0

Alle Ressourcen zum Erstellen der register.html? – Tunisia

+0

@Tunisia jsut erstellen Sie eine Vorlage und rendern Sie die 'Form', genau wie für das Anmeldeformular in den Dokumenten. –