mirror of
https://github.com/FuzzyGrim/Yamtrack.git
synced 2026-03-03 02:27:01 +00:00
add user register/login
This commit is contained in:
@@ -1 +1,5 @@
|
||||
# Yamtarr
|
||||
# Yamtarr
|
||||
|
||||
`python manage.py make migrations`
|
||||
`python manage.py migrate`
|
||||
`python manage.py createsuperuser`
|
||||
@@ -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'
|
||||
@@ -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
9
app/forms.py
Normal 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']
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
<div class="title">
|
||||
<span class="align-middle">Yamtarr</span>
|
||||
|
||||
</div>
|
||||
|
||||
</main>
|
||||
@@ -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>
|
||||
53
app/templates/app/login.html
Normal file
53
app/templates/app/login.html
Normal 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 %}
|
||||
34
app/templates/app/logout.html
Normal file
34
app/templates/app/logout.html
Normal 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 %}
|
||||
51
app/templates/app/profile.html
Normal file
51
app/templates/app/profile.html
Normal 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 %}
|
||||
46
app/templates/app/register.html
Normal file
46
app/templates/app/register.html
Normal 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 %}
|
||||
@@ -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"),
|
||||
]
|
||||
40
app/views.py
40
app/views.py
@@ -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)
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
django
|
||||
python-decouple
|
||||
python-decouple
|
||||
django-crispy-forms
|
||||
crispy-bootstrap5
|
||||
Reference in New Issue
Block a user