Modifique o src/e_commerce/forms.py, para criar a classe LoginForm e RegisterForm. E também, faça o import do get_user_model.
from django import forms
from django.contrib.auth import get_user_model
User = get_user_model()
class ContactForm(forms.Form):
full_name = forms.CharField(
widget=forms.TextInput(
attrs={
"class": "form-control",
"placeholder": "Seu nome completo"
}
)
)
email = forms.EmailField(
widget=forms.EmailInput(
attrs={
"class": "form-control",
"placeholder": "Digite seu email"
}
)
)
content = forms.CharField(
widget=forms.Textarea(
attrs={
"class": "form-control",
"placeholder": "Digite sua mensagem"
}
)
)
def clean_email(self):
email = self.cleaned_data.get("email")
if not "gmail.com" in email:
raise forms.ValidationError("O Email deve ser do gmail.com")
return email
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
class RegisterForm(forms.Form):
username = forms.CharField()
email = forms.EmailField()
password = forms.CharField(widget=forms.PasswordInput)
password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput)
def clean_username(self):
username = self.cleaned_data.get('username')
qs = User.objects.filter(username=username)
if qs.exists():
raise forms.ValidationError("Esse usuário já existe, escolha outro nome.")
return username
def clean_email(self):
email = self.cleaned_data.get('email')
qs = User.objects.filter(email=email)
if qs.exists():
raise forms.ValidationError("Esse email já existe, tente outro!")
return email
def clean(self):
data = self.cleaned_data
password = self.cleaned_data.get('password')
password2 = self.cleaned_data.get('password2')
if password != password2:
raise forms.ValidationError("As senhas informadas devem ser iguais!")
return data
Importe das classes
Agora em src/e_commerce/views.py, importe a classe ContactForm, LoginForm, RegisterForm, importe também authenticate, login, get_user_model e redirect do django, e crie os métodos login_page e register_page.
from django.contrib.auth import authenticate, login, get_user_model
from django.http import HttpResponse
from django.shortcuts import render, redirectfrom .forms import ContactForm, LoginForm, RegisterForm
def home_page(request):
context = {
"title": "Home Page",
"content": "Bem vindo a Home Page",
}
if request.user.is_authenticated:
context["premium_content"] = "Você é um usuário Premium"
return render(request, "home_page.html", context)
def about_page(request):
context = {
"title": "About Page",
"content": "Bem vindo a About Page"
}
return render(request, "about/view.html", context)
def contact_page(request):
contact_form = ContactForm(request.POST or None)
context = {
"title": "Contact Page",
"content": "Bem vindo a Contact Page",
"form": contact_form
}
if contact_form.is_valid():
print(contact_form.cleaned_data)
return render(request, "contact/view.html", context)
def login_page(request):
form = LoginForm(request.POST or None)
context = {
"form": form
}
print("User logged in")
#print(request.user.is_authenticated)
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request, username=username, password=password)
print(user)
#print(request.user.is_authenticated)
if user is not None:
#print(request.user.is_authenticated)
login(request, user)
print("Login válido")
# Redireciona para uma página de sucesso.
return redirect("/")
else:
#Retorna uma mensagem de erro de 'invalid login'.
print("Login inválido")
return render(request, "auth/login.html", context)User = get_user_model()
def register_page(request):
form = RegisterForm(request.POST or None)
context = {
"form": form
}
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get("username")
email = form.cleaned_data.get("email")
password = form.cleaned_data.get("password")
new_user = User.objects.create_user(username, email, password)
print(new_user)
return render(request, "auth/register.html", context)
get_user_model
O get_user_model serve para retornar o model de user ativo no momento.
O Django tem duas funções no django.contrib.auth:
authenticate()
login()
authenticate
O authenticate() é para autenticar o username e senha.
login
O login() e para logar um usuário. Em uma view ele recebe um objeto HttpRequest e um User.
A função login() salva o ID do usuário na sessão usando o framework de sessão do Django.
Quando você está logando um usuário, você deve chamar authenticate() antes de chamar login().
A função authenticate() seta um atributo sobre o User observando que o backend de autenticação, autenticou o usuário com sucesso
Ele recebe dois argumentos: username e password e retorna um objeto User se a senha for válida para este username e None e a senha for inválida.
cleaned_data
O cleaned_data é um dicionário com os dados limpos do formulário, ele retorna esses dados limpos.
Cada campo em uma classe Form é responsável não apenas pela validação de dados, mas também por “limpá-lo”, normalizando-o para um formato consistente.
Esse é um recurso interessante porque permite que os dados de um determinado campo sejam inseridos de várias maneiras, sempre resultando em resultados consistentes.
Por exemplo, DateField normaliza a entrada em um objeto datetime.date do Python, independentemente de você passar uma string no formato '2018-07-15', um objeto datetime.date ou vários outros formatos, DateField sempre o normalizará para um objeto datetime.date, desde que seja válido.
Depois de criar uma instância de formulário com um conjunto de dados e validá-la, você pode acessar os dados limpos por meio do atributo cleaned_data.
Agora vamos criar src/template/auth/login.html
Vamos fazer as migrações para o banco
python manage.py makemigrationspython manage.py migrate
Agora crie um super usuário
python manage.py createsuperuser
Escolha um nome e uma senha para esse usuário.
Vamos importar login_page, register_page no src/e_commerce/urls.py e adicionar no urlpatterns.