Question

I want to create a signup view. Here, my code:

from django.shortcuts import get_object_or_404, render, redirect
from django.contrib.auth import authenticate, login as auth_login
from django.contrib.auth.models import User

# create a function to resolve email to username
def get_user(email):
    try:
        return User.objects.get(email=email.lower())
    except User.DoesNotExist:
        return None

def signup(request):
    if request.method == "GET":
        return render(request, 'accounts/signup.html')
    if request.method == "POST":
        email = request.POST['email']
        last_name = request.POST['last_name']
        first_name = request.POST['first_name']
        password = request.POST['password']
        password2 = request.POST['password2']
        user = get_user(email)
        if password == password2:
            if user is None:
                user = User.objects.create_user(last_name, email, password)
                user.first_name = first_name
                user.save()
                user = authenticate(username=user, password=password)
                #login
                return redirect('/')
            else:
                #messages
                return render(request, 'accounts/signup.html')
        else:
            #messages
            return render(request, 'accounts/signup.html')

I need you for make that better because like you see, he's it bit messy.

I don't know if it's better to use a plugin like django-registration for this task?

Thanks a lots!

Was it helpful?

Solution

First you do a form class in forms.py in your app. There you define your fields like 'email', 'first_name', ... You override the clean method in your form class, then you use it with your view.

class RegistrationForm(forms.Form):
    username = forms.EmailField(max_length=30, widget=forms.TextInput(attrs=attrs_dict))
    password1 = forms.PasswordField()
    password2 = forms.PasswordField()
    first_name = forms.CharField(max_length=100)
    # rest of the fields

    def clean(self):
        cleaned_data = super(RegistrationForm, self).clean()
        username = cleaned_data.get("username")
        password1 = cleaned_data.get("password1")
        password2 = cleaned_data.get("password2")

        # you can validate those here

    class Meta:
        model = User

Then in your view you

from forms import RegistrationForm

def signup(request):
    if request.method == "GET":
        return render(request, 'accounts/signup.html')
    if request.method == "POST":
        form = RegistrationForm(data = request.POST):
        if form.is_valid():
            user = form.save(False)
            user.set_password(user.password)
            user.save()
            user = authenticate(username=user.username, password=request.POST['password1'])
            login(request, user)

            return redirect('/')

It makes plenty use of what django gives you for free.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top