feat: Forum App - 3. Add Login Endpoint

1. Use django.contrib.auth.views.LoginView for login views function.
2. Add profile template, urls
and views for profile page.
master
Bobson Lin 5 years ago
parent bb0e3d33e8
commit 075b0484c5

@ -120,3 +120,7 @@ USE_TZ = True
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'

@ -28,17 +28,18 @@
</a>
<a class="navbar-item">
Documentation
Profile
</a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<p class="has-margin-right-10">Welcome, {{ user }}</p>
<div class="buttons">
<a class="button is-primary" href="{% url 'register' %}">
<strong>Sign up</strong>
</a>
<a class="button is-light">
<a class="button is-light" href="{% url 'login' %}">
Log in
</a>
</div>

@ -1,10 +1,22 @@
from django import forms
from django.utils.html import format_html
from django.forms.utils import ErrorList
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
class BulmaFormErrorList(ErrorList):
def __str__(self):
return self.as_p()
def as_p(self):
if not self:
return ''
return format_html('<p class="help is-danger">{}</p>', *[e for e in self])
class ExtendedUserCreationForm(UserCreationForm):
error_css_class = "help is-danger"
email = forms.EmailField(required=True)
class Meta:
@ -13,6 +25,7 @@ class ExtendedUserCreationForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.error_class = BulmaFormErrorList
self.fields['username'].widget.attrs.update(
{'class': 'input', 'placeholder': 'Your username', 'required': True})
self.fields['email'].widget.attrs.update(
@ -28,3 +41,14 @@ class ExtendedUserCreationForm(UserCreationForm):
if commit:
user.save()
return user
class ExtendedAuthenticationForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.error_class = BulmaFormErrorList
self.fields['username'].widget.attrs.update(
{'class': 'input', 'placeholder': 'Enter your username', 'required': True})
self.fields['password'].widget.attrs.update(
{'class': 'input', 'placeholder': 'Enter your password', 'required': True})

@ -0,0 +1,43 @@
{% extends 'base.html' %} {% block title %}Login{% endblock %} {% block body %}
<div class="container">
{% include 'navbar.html' %}
<div class="columns has-margin-top-5">
<div class="column is-half is-offset-one-quarter">
<div class="card">
<header class="card-header">
<p class="card-header-title">
Log in
</p>
</header>
<div class="card-content">
<div class="content">
<form action="" method="post">
{% csrf_token %}
<div class="field">
<label class="label">Username</label>
<div class="control">
{{ form.username }}
</div>
{{ form.username.errors }}
</div>
<div class="field">
<label class="label">Password</label>
<div class="control">
{{ form.password }}
</div>
{{ form.username.errors }}
</div>
<div class="control">
<button class="button is-primary">Login</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block title %}Register{% endblock %}
{% block body %}
<div class="container">
{% include 'navbar.html' %}
<p>Profile Page</p>
</div>
{% endblock %}

@ -31,9 +31,7 @@
<div class="control">
{{ form.email }}
</div>
<p class="help is-danger">
{{ form.email.errors }}
</p>
{{ form.email.errors }}
</div>
<div class="field">
@ -41,9 +39,7 @@
<div class="control">
{{ form.password1 }}
</div>
<p class="help is-danger">
{{ form.password1.errors }}
</p>
{{ form.password1.errors }}
</div>
<div class="field">
@ -51,9 +47,7 @@
<div class="control">
{{ form.password2 }}
</div>
<p class="help is-danger">
{{ form.password2.errors }}
</p>
{{ form.password2.errors }}
</div>
<div class="control">

@ -1,6 +1,13 @@
from django.urls import path
from django.contrib.auth import views as auth_view
from . import views
from .forms import ExtendedAuthenticationForm
urlpatterns = [
path('register/', views.register, name='register')
path('register/', views.register, name='register'),
path('login/',
auth_view.LoginView.as_view(template_name='user_profile/login.html',
authentication_form=ExtendedAuthenticationForm),
name='login'),
path('profile', views.profile, name='profile')
]

@ -8,7 +8,7 @@ def register(request):
form = ExtendedUserCreationForm(request.POST)
if form.is_valid():
form.save()
# TODO: Auto login after register successfully
# Auto login after register successfully
user = authenticate(request, username=form.cleaned_data.get('username'),
password=form.cleaned_data.get('password1'))
if user is not None:
@ -17,3 +17,7 @@ def register(request):
else:
form = ExtendedUserCreationForm()
return render(request, 'user_profile/register.html', {'form': form})
def profile(request):
return render(request, 'user_profile/profile.html')

Loading…
Cancel
Save