web-dev-qa-db-fra.com

Meilleure façon d'enregistrer un utilisateur dans Django

J'essaie d'implémenter l'enregistrement utilisateur pour mon Django. Le livre que j'ai lu mentionne UserCreationForm mais j'ai besoin de plus que du nom, du mot de passe et de l'adresse e-mail. Je pourrais implémenter mon propre objet utilisateur et utiliser ModelForm je pense, mais ensuite je perds certaines des commodités Django pour l'authentification. Enfin, j'ai lu quelque chose sur les profils d'utilisateurs qui complètent les utilisateurs, je suppose, donc je pense que j'ai besoin d'une combinaison de tous de ces choses. Voici ce que j'ai jusqu'à présent.

Vue - c'est assez simple. Tout ce que je veux faire ici, c'est créer mon formulaire et enregistrer l'utilisateur

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

Formulaire - c'est mon formulaire pour créer un utilisateur. Ou du moins au début

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

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

Modèle - c'est mon profil utilisateur avec lequel je veux compléter l'utilisateur.

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

Est-ce clair ce que j'essaie de faire? Suis-je sur la bonne voie

37
JPC

Créez des modèles deux, un pour le modèle User et un pour le modèle UserProfile.

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

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

Donnez-leur des préfixes et affichez-les ensemble dans le même élément de formulaire HTML. Dans la vue, vérifiez que les deux sont valides avant d'enregistrer l'utilisateur, puis le profil utilisateur.

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

Dans register.html:

<form method="POST" action="">
    {% csrf_token %}
    {{userform}}
    {{userprofileform}}
    <input type="submit">
</form>
31
Vebjorn Ljosa

J'étais juste en train de regarder cela et j'ai découvert que Django a un très simple formulaire de création d'utilisateur intégré, que vous pouvez utiliser si vous voulez un enregistrement simple - il n'y a pas d'option, par exemple , enregistrez une adresse e-mail et validez-la, donc cela ne fonctionnera pas pour le cas d'utilisation de l'OP, mais je la poste ici au cas où d'autres rencontreraient cette question comme moi, et recherchent quelque chose de simple.

Si vous voulez juste que les gens puissent choisir un nom d'utilisateur et un mot de passe, alors les intégrés feront tout pour vous , y compris la validation et l'enregistrement du nouveau utilisateur:

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
)

Donc, la seule chose que vous avez à faire vous-même est de créer register.html ...

Plus d'informations ici: http://www.obeythetestinggoat.com/using-the-built-in-views-and-forms-for-new-user-registration-in-Django.html

29
hwjp