feat: Forum App - 2. Setup and create user registration
parent
f8c29b7a14
commit
bb0e3d33e8
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,15 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>{% block title %}{% endblock %}</title>
|
||||
<link rel="stylesheet" href="{% static 'css/bulma.css' %}" />
|
||||
<link rel="stylesheet" href="{% static 'css/bulma-helpers.css' %}" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
{% block body %} {% endblock %}
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,12 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Index{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="container">
|
||||
|
||||
{% include 'navbar.html' %}
|
||||
|
||||
<h1>Forum Index</h1>
|
||||
</div>
|
||||
{% endblock %}
|
@ -0,0 +1,48 @@
|
||||
<nav class="navbar" role="navigation" aria-label="main navigation">
|
||||
<div class="navbar-brand">
|
||||
<a class="navbar-item" href="{% url 'index' %}">
|
||||
<img
|
||||
src="https://bulma.io/images/bulma-logo.png"
|
||||
width="112"
|
||||
height="28"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a
|
||||
role="button"
|
||||
class="navbar-burger burger"
|
||||
aria-label="menu"
|
||||
aria-expanded="false"
|
||||
data-target="navbarBasicExample"
|
||||
>
|
||||
<span aria-hidden="true"></span>
|
||||
<span aria-hidden="true"></span>
|
||||
<span aria-hidden="true"></span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div id="navbarBasicExample" class="navbar-menu">
|
||||
<div class="navbar-start">
|
||||
<a class="navbar-item">
|
||||
Home
|
||||
</a>
|
||||
|
||||
<a class="navbar-item">
|
||||
Documentation
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="navbar-end">
|
||||
<div class="navbar-item">
|
||||
<div class="buttons">
|
||||
<a class="button is-primary" href="{% url 'register' %}">
|
||||
<strong>Sign up</strong>
|
||||
</a>
|
||||
<a class="button is-light">
|
||||
Log in
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
@ -0,0 +1,6 @@
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.index, name='index')
|
||||
]
|
@ -1,3 +1,5 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
|
||||
def index(request):
|
||||
return render(request, 'forum/index.html')
|
||||
|
@ -0,0 +1,30 @@
|
||||
from django import forms
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.auth.forms import UserCreationForm
|
||||
|
||||
|
||||
class ExtendedUserCreationForm(UserCreationForm):
|
||||
error_css_class = "help is-danger"
|
||||
email = forms.EmailField(required=True)
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ('username', 'email', 'password1', 'password2')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields['username'].widget.attrs.update(
|
||||
{'class': 'input', 'placeholder': 'Your username', 'required': True})
|
||||
self.fields['email'].widget.attrs.update(
|
||||
{'class': 'input', 'placeholder': 'Your email', 'required': True})
|
||||
self.fields['password1'].widget.attrs.update(
|
||||
{'class': 'input', 'placeholder': 'Your password', 'required': True})
|
||||
self.fields['password2'].widget.attrs.update(
|
||||
{'class': 'input', 'placeholder': 'Confirm your password', 'required': True})
|
||||
|
||||
def save(self, commit=True):
|
||||
user = super().save(commit=False)
|
||||
user.email = self.cleaned_data.get('email')
|
||||
if commit:
|
||||
user.save()
|
||||
return user
|
@ -0,0 +1,69 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Register{% 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">
|
||||
Register
|
||||
</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">Email</label>
|
||||
<div class="control">
|
||||
{{ form.email }}
|
||||
</div>
|
||||
<p class="help is-danger">
|
||||
{{ form.email.errors }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label class="label">Password</label>
|
||||
<div class="control">
|
||||
{{ form.password1 }}
|
||||
</div>
|
||||
<p class="help is-danger">
|
||||
{{ form.password1.errors }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label class="label">Confirm password</label>
|
||||
<div class="control">
|
||||
{{ form.password2 }}
|
||||
</div>
|
||||
<p class="help is-danger">
|
||||
{{ form.password2.errors }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="control">
|
||||
<button class="button is-primary">Submit</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
@ -0,0 +1,6 @@
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('register/', views.register, name='register')
|
||||
]
|
@ -1,3 +1,19 @@
|
||||
from django.shortcuts import render
|
||||
from django.shortcuts import render, redirect
|
||||
from django.contrib.auth import authenticate, login
|
||||
from .forms import ExtendedUserCreationForm
|
||||
|
||||
# Create your views here.
|
||||
|
||||
def register(request):
|
||||
if request.method == 'POST':
|
||||
form = ExtendedUserCreationForm(request.POST)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
# TODO: 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:
|
||||
login(request, user)
|
||||
return redirect('index')
|
||||
else:
|
||||
form = ExtendedUserCreationForm()
|
||||
return render(request, 'user_profile/register.html', {'form': form})
|
||||
|
Loading…
Reference in New Issue