add user register/login

This commit is contained in:
FuzzyGrim
2022-12-13 14:20:17 +01:00
parent ac899fb498
commit 56a615b395
15 changed files with 320 additions and 27 deletions

View File

@@ -1 +1,5 @@
# Yamtarr
# Yamtarr
`python manage.py make migrations`
`python manage.py migrate`
`python manage.py createsuperuser`

View File

@@ -33,6 +33,8 @@ ALLOWED_HOSTS = []
INSTALLED_APPS = [
'app',
'crispy_forms',
'crispy_bootstrap5',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
@@ -123,3 +125,10 @@ STATIC_URL = 'static/'
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
CRISPY_TEMPLATE_PACK = "bootstrap5"
LOGIN_REDIRECT_URL = 'home'
LOGIN_URL = 'login'

View File

@@ -14,7 +14,10 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import include, path
from django.contrib import admin
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('app.urls')),
]

9
app/forms.py Normal file
View File

@@ -0,0 +1,9 @@
from django import forms
from django.contrib.auth.models import User
class UserUpdateForm(forms.ModelForm):
class Meta:
model = User
fields = ['username']

View File

@@ -1,3 +1,15 @@
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Media(models.Model):
code = models.IntegerField()
title = models.CharField(max_length=100)
description = models.TextField()
image = models.TextField()
year = models.IntegerField()
content = models.CharField(max_length=10)
seasons = models.IntegerField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title

View File

@@ -1,7 +1,3 @@
body {
background-color: #181A1B;
}
.navbar {
background-color: #24292F;
}
@@ -10,8 +6,16 @@ body {
font-size: 1.3rem;
color: #CAC8C8 !important;
}
.navbar-brand.abs{
position: absolute;
width: auto;
left: 50%;
transform: translateX(-50%);
text-align: center;
}
form .form-select {
.navbar-brand.abs .form-select {
border-radius: 0;
width: auto;
background-color: #262A2D;
@@ -22,12 +26,13 @@ form .form-select {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%2356595D' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
}
form .form-control{
.navbar-brand.abs .form-control{
border-radius: 0;
border-width: 1px 0px 1px 0px;
border-style: solid;
border-color: #56595D;
background-color: #232224;
width: 10rem;
}
form .btn{
@@ -38,7 +43,11 @@ form .btn{
background-color: #232224;
}
#search main {
#search{
background-color: #181A1B;
}
main {
padding: 6em 2em 2em 2em;
}

View File

@@ -20,6 +20,7 @@
<div class="title">
<span class="align-middle">Yamtarr</span>
</div>
</main>

View File

@@ -1,26 +1,45 @@
<nav class="navbar fixed-top navbar-expand-lg">
<nav class="navbar fixed-top navbar-expand-md">
<div class="container-fluid">
<form class="d-flex navbar-brand abs input-group" method="post">
{% csrf_token %}
<select name="content" class="form-select">
<option value="multi">TMDB</option>
<option value="movie">MOVIE</option>
<option value="tv">SHOW</option>
<option value="manga">MANGA</option>
</select>
<input class="form-control bg-dark text-white" type="text" name="query" placeholder="Search" aria-label="Search" required>
<button class="btn bg-dark text-white" type="submit"><i class="bi bi-search"></i></button>
</form>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link active rounded" href="/"> <i class="bi bi-house"></i> Home</a>
</li>
<a class="nav-link active rounded " href="https://github.com/FuzzyGrim/SummonerStats"> <i class="bi bi-github"> </i> Github</a>
<li class="nav-item">
<a class="nav-link active rounded" href="/"> <i class="bi bi-github"></i> Github</a>
</li>
</ul>
<ul class="navbar-nav ms-auto">
{% if user.is_authenticated %}
<li class="nav-item">
<a class="nav-link" href="{% url 'profile' %}">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'logout' %}">Logout</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{% url 'login' %}">Login</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'register' %}">Register</a>
</li>
{% endif %}
</ul>
<form class="d-flex" method="post">
{% csrf_token %}
<select name="content" class="form-select">
<option value="multi">TMDB</option>
<option value="movie">MOVIE</option>
<option value="tv">SHOW</option>
<option value="manga">MANGA</option>
</select>
<input class="form-control bg-dark text-white" type="text" name="query" placeholder="Search" aria-label="Search" required>
<button class="btn bg-dark text-white" type="submit"><i class="bi bi-search"></i></button>
</form>
</div>
</div>
</nav>

View File

@@ -0,0 +1,53 @@
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<!DOCTYPE html>
<html lang="en">
<head>
{% include "app/include/tags.html" %}
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
<title>Yamtarr | Login</title>
</head>
<body id="home">
{% include "app/include/navbar.html" %}
<main>
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
<legend class="border-bottom mb-4">Login</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn bg-dark text-white" type="submit">Login</button>
</div>
</form>
<div class="border-top pt-3">
<small class="text-muted">
Need An Account? <a class="ml-2" href="{% url 'register' %}">Sign Up Now</a>
</small>
</div>
</div>
</main>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
</body>
</html>
{% endblock %}

View File

@@ -0,0 +1,34 @@
{% load static %}
{% block content %}
<!DOCTYPE html>
<html lang="en">
<head>
{% include "app/include/tags.html" %}
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
<title>Yamtarr | Logout</title>
</head>
<body id="home">
{% include "app/include/navbar.html" %}
<main>
<h2> You have been logged out</h2>
<div class="border-top pt-3">
<small class="text-muted">
<a href="#">Log In Again</a>
</small>
</div>
</main>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
</body>
</html>
{% endblock %}

View File

@@ -0,0 +1,51 @@
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<!DOCTYPE html>
<html lang="en">
<head>
{% include "app/include/tags.html" %}
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
<title>Yamtarr | Profile</title>
</head>
<body id="home">
{% include "app/include/navbar.html" %}
<main>
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
<div class="media">
<h2 class="account-heading">{{ user.username }}</h2>
</div>
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Profile</legend>
{{ user_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn bg-dark text-white" type="submit">Update</button>
</div>
</form>
</main>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
</body>
</html>
{% endblock %}

View File

@@ -0,0 +1,46 @@
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<!DOCTYPE html>
<html lang="en">
<head>
{% include "app/include/tags.html" %}
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
<title>Yamtarr | Register</title>
</head>
<body id="home">
{% include "app/include/navbar.html" %}
<main>
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Join Today</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn bg-dark text-white" type="submit">Sign Up</button>
</div>
</form>
<div class="border-top pt-3">
<small class="text-muted">
Already Have An Account? <a class="ml-2" href="{% url 'login' %}">Sign In</a>
</small>
</div>
</div>
</main>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
</body>
</html>
{% endblock %}

View File

@@ -1,8 +1,13 @@
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
urlpatterns = [
path("", views.index),
path("", views.home, name = "home"),
path("search/<str:content>/<str:query>/", views.search),
path("register/", views.register, name = "register"),
path("profile/", views.profile, name = "profile"),
path("login/", auth_views.LoginView.as_view(template_name="app/login.html"), name = "login"),
path("logout/", auth_views.LogoutView.as_view(template_name="app/logout.html"), name = "logout"),
]

View File

@@ -1,14 +1,19 @@
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from app.utils import api
from app.forms import UserUpdateForm
def index(request):
def home(request):
"""Home page"""
if ("content" and "query") in request.POST:
return redirect(
"/search/" + request.POST["content"] + "/" + request.POST["query"] + "/"
)
return render(request, "app/index.html")
return render(request, "app/home.html")
def search(request, content, query):
"""Search page"""
@@ -22,4 +27,35 @@ def search(request, content, query):
}
return render(request, "app/search.html", context)
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account created for {username}! You can now log in')
return redirect('login')
else:
form = UserCreationForm()
return render(request, 'app/register.html', {'form': form})
@login_required
def profile(request):
if request.method == 'POST':
user_form = UserUpdateForm(request.POST, instance=request.user)
if user_form.is_valid():
user_form.save()
messages.success(request, f'Your account has been updated!')
return redirect('profile')
else:
user_form = UserUpdateForm(instance=request.user)
context = {
'user_form': user_form
}
return render(request, 'app/profile.html', context)

View File

@@ -1,2 +1,4 @@
django
python-decouple
python-decouple
django-crispy-forms
crispy-bootstrap5