asd
This commit is contained in:
0
core/__init__.py
Normal file
0
core/__init__.py
Normal file
BIN
core/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
core/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/admin.cpython-38.pyc
Normal file
BIN
core/__pycache__/admin.cpython-38.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/apps.cpython-38.pyc
Normal file
BIN
core/__pycache__/apps.cpython-38.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/models.cpython-38.pyc
Normal file
BIN
core/__pycache__/models.cpython-38.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/urls.cpython-38.pyc
Normal file
BIN
core/__pycache__/urls.cpython-38.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/views.cpython-38.pyc
Normal file
BIN
core/__pycache__/views.cpython-38.pyc
Normal file
Binary file not shown.
8
core/admin.py
Normal file
8
core/admin.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from django.contrib import admin
|
||||
|
||||
|
||||
from .models import Video
|
||||
|
||||
@admin.register(Video)
|
||||
class RequestDemoAdmin(admin.ModelAdmin):
|
||||
list_display = [field.name for field in Video._meta.get_fields()]
|
||||
6
core/apps.py
Normal file
6
core/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class CoreConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'core'
|
||||
26
core/migrations/0001_initial.py
Normal file
26
core/migrations/0001_initial.py
Normal file
@@ -0,0 +1,26 @@
|
||||
# Generated by Django 4.1.7 on 2023-05-09 18:43
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Video',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('name', models.TextField()),
|
||||
('file', models.FileField(upload_to='videos/')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'Video',
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,25 @@
|
||||
# Generated by Django 4.1.7 on 2023-05-09 18:59
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('core', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='video',
|
||||
name='thumbnail',
|
||||
field=models.FileField(default=None, upload_to='videos/'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='video',
|
||||
name='created_at',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.1.7 on 2023-05-09 19:00
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('core', '0002_video_thumbnail_alter_video_created_at'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='video',
|
||||
name='file',
|
||||
field=models.FileField(null=True, upload_to='videos/'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='video',
|
||||
name='thumbnail',
|
||||
field=models.FileField(null=True, upload_to='videos/'),
|
||||
),
|
||||
]
|
||||
0
core/migrations/__init__.py
Normal file
0
core/migrations/__init__.py
Normal file
BIN
core/migrations/__pycache__/0001_initial.cpython-38.pyc
Normal file
BIN
core/migrations/__pycache__/0001_initial.cpython-38.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
core/migrations/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
core/migrations/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
16
core/models.py
Normal file
16
core/models.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
# Create your models here.
|
||||
class Video(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
name = models.TextField()
|
||||
file = models.FileField(upload_to='videos/', null=True)
|
||||
thumbnail = models.FileField(upload_to='videos/', null=True)
|
||||
created_at = models.DateTimeField(default=timezone.now)
|
||||
|
||||
class Meta:
|
||||
db_table = 'Video'
|
||||
|
||||
def __str__(self):
|
||||
return str(self.id)
|
||||
140
core/templates/about.html
Normal file
140
core/templates/about.html
Normal file
@@ -0,0 +1,140 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>UnusualArchive</title>
|
||||
|
||||
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'plugins/icheck-bootstrap/icheck-bootstrap.min.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'dist/css/adminlte.css' %}">
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
|
||||
|
||||
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
|
||||
</head>
|
||||
<body class="layout-top-nav" style="height: auto;">
|
||||
<div class="wrapper">
|
||||
|
||||
<nav class="main-header navbar navbar-expand-md navbar-light navbar-white">
|
||||
<div class="container">
|
||||
<a href="/" class="navbar-brand">
|
||||
<img src="{% static 'dist/img/ragnarok.jpg' %}" alt="Ragnarok" class="brand-image img-circle elevation-3" style="opacity: .8">
|
||||
<span class="brand-text font-weight-light">UnusualArchive</span>
|
||||
</a>
|
||||
<button class="navbar-toggler order-1" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse order-3" id="navbarCollapse">
|
||||
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">Explore</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="/status" class="nav-link">Status</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="/about" class="nav-link">About</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="float-right" style="width:100%">
|
||||
<form class="form-inline ml-0 ml-md-3 float-right">
|
||||
<div class="input-group input-group-sm">
|
||||
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-navbar" type="submit">
|
||||
<i class="fas fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div class="content-wrapper" style="min-height: 1128px;">
|
||||
|
||||
<div class="content-header">
|
||||
<div class="container">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1 class="m-0"> About</h1>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="content">
|
||||
<div class="container">
|
||||
{% block content %}
|
||||
<div class="row mb-3">
|
||||
|
||||
|
||||
<div class="col-12">
|
||||
<div class="card card-primary">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
The Siebenhirten stands as a testament to the critical importance of preserving the knowledge and cultural artifacts of our society. In an age where digital information can be lost in the blink of an eye, the work of the Siebenhirten is nothing short of vital.
|
||||
|
||||
The Group's mission to archive the videos of UnusualVideos is not just a noble pursuit, but a necessary one. In the face of the ever-present threat of censorship, copyright claims, and technological obsolescence, it falls upon groups like Siebenhirten to safeguard the information that would otherwise be lost forever.
|
||||
|
||||
Their journey has been long and arduous, fraught with challenges and obstacles at every turn. But their unwavering dedication and tireless efforts have paid off in ways that cannot be overstated. Through their actions, they have ensured that future generations will have access to the knowledge and cultural artifacts that define our society today.
|
||||
|
||||
The Siebenhirten is not just a group of archivists, but guardians of our collective history. They have taken on the mantle of responsibility, understanding that the preservation of knowledge and cultural artifacts is essential to the survival of our species.
|
||||
|
||||
As we move forward into an uncertain future, it is essential that we continue to support the work of groups like the Siebenhirten. Their dedication to preserving the knowledge and culture of our society is not just admirable, but necessary. It is only through their efforts that we can hope to ensure that future generations have access to the information that defines us as a species.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<footer class="main-footer">
|
||||
|
||||
<div class="float-right d-none d-sm-inline">
|
||||
Für die Nachwelt.
|
||||
</div>
|
||||
|
||||
<strong>Copyright © 2023 Siebenhirten
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script src="{% static 'plugins/jquery/jquery.min.js' %}"></script>
|
||||
<script src="{% static 'plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
|
||||
<script src="{% static 'dist/js/adminlte.min.js' %}"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$(".clickable-row").click(function() {
|
||||
window.location.href = $(this).data("href");
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
132
core/templates/base.html
Normal file
132
core/templates/base.html
Normal file
@@ -0,0 +1,132 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>UnusualArchive</title>
|
||||
|
||||
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'plugins/icheck-bootstrap/icheck-bootstrap.min.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'dist/css/adminlte.css' %}">
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
|
||||
|
||||
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
|
||||
</head>
|
||||
<body class="layout-top-nav" style="height: auto;">
|
||||
<div class="wrapper">
|
||||
|
||||
<nav class="main-header navbar navbar-expand-md navbar-light navbar-white">
|
||||
<div class="container">
|
||||
<a href="/" class="navbar-brand">
|
||||
<img src="{% static 'dist/img/ragnarok.jpg' %}" alt="Ragnarok" class="brand-image img-circle elevation-3" style="opacity: .8">
|
||||
<span class="brand-text font-weight-light">UnusualArchive</span>
|
||||
</a>
|
||||
<button class="navbar-toggler order-1" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse order-3" id="navbarCollapse">
|
||||
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">Explore</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="/status" class="nav-link">Status</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="/about" class="nav-link">About</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="float-right" style="width:100%">
|
||||
<form class="form-inline ml-0 ml-md-3 float-right">
|
||||
<div class="input-group input-group-sm">
|
||||
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-navbar" type="submit">
|
||||
<i class="fas fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div class="content-wrapper" style="min-height: 1128px;">
|
||||
|
||||
<div class="content-header">
|
||||
<div class="container">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1 class="m-0"> Explore</h1>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="content">
|
||||
<div class="container">
|
||||
{% block content %}
|
||||
<div class="row mb-3">
|
||||
|
||||
{% for v in videos %}
|
||||
<div class="col-xs-6 col-md-4">
|
||||
<a href="/media/{{ v.file }}">
|
||||
|
||||
<div class="card mb-2 bg-gradient-dark">
|
||||
{% if v.thumbnail %}
|
||||
<img class="card-img-top" src="/media/{{v.thumbnail}}" alt="Dist Photo 1">
|
||||
{% else %}
|
||||
<img class="card-img-top" src="{% static 'dist/img/photo1.png' %}" alt="Dist Photo 1">
|
||||
{% endif %}
|
||||
<div class="card-img-overlay d-flex flex-column justify-content-end" style="background-color: rgba(0, 0, 0, 0.5);">
|
||||
<h5 class="card-title"><b>V{{ v.id }}</b></h5>
|
||||
<span>{{v.created_at}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<footer class="main-footer">
|
||||
|
||||
<div class="float-right d-none d-sm-inline">
|
||||
Für die Nachwelt.
|
||||
</div>
|
||||
|
||||
<strong>Copyright © 2023 Siebenhirten
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script src="{% static 'plugins/jquery/jquery.min.js' %}"></script>
|
||||
<script src="{% static 'plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
|
||||
<script src="{% static 'dist/js/adminlte.min.js' %}"></script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
156
core/templates/status.html
Normal file
156
core/templates/status.html
Normal file
@@ -0,0 +1,156 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>UnusualArchive</title>
|
||||
|
||||
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'plugins/icheck-bootstrap/icheck-bootstrap.min.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'dist/css/adminlte.css' %}">
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
|
||||
|
||||
<link rel="stylesheet" href="{% static 'plugins/fontawesome-free/css/all.min.css' %}">
|
||||
</head>
|
||||
<body class="layout-top-nav" style="height: auto;">
|
||||
<div class="wrapper">
|
||||
|
||||
<nav class="main-header navbar navbar-expand-md navbar-light navbar-white">
|
||||
<div class="container">
|
||||
<a href="/" class="navbar-brand">
|
||||
<img src="{% static 'dist/img/ragnarok.jpg' %}" alt="Ragnarok" class="brand-image img-circle elevation-3" style="opacity: .8">
|
||||
<span class="brand-text font-weight-light">UnusualArchive</span>
|
||||
</a>
|
||||
<button class="navbar-toggler order-1" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse order-3" id="navbarCollapse">
|
||||
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">Explore</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="/status" class="nav-link">Status</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="/about" class="nav-link">About</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="float-right" style="width:100%">
|
||||
<form class="form-inline ml-0 ml-md-3 float-right">
|
||||
<div class="input-group input-group-sm">
|
||||
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-navbar" type="submit">
|
||||
<i class="fas fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div class="content-wrapper" style="min-height: 1128px;">
|
||||
|
||||
<div class="content-header">
|
||||
<div class="container">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6">
|
||||
<h1 class="m-0"> Status</h1>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="content">
|
||||
<div class="container">
|
||||
{% block content %}
|
||||
<div class="row mb-3">
|
||||
|
||||
|
||||
<div class="col-12">
|
||||
<div class="card card-primary">
|
||||
<div class="card-body">
|
||||
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<a href="/media/{{ v.file }}">
|
||||
<tr class="clickable-row" data-href="/media/{{ v.file }}">
|
||||
<th style="width: 10px">#</th>
|
||||
<th style="text-align:right">Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for v in video_list %}
|
||||
<tr>
|
||||
<td><b>V{{v.id}}</b></td>
|
||||
{% if v.file %}
|
||||
<td style="text-align:right"><i class="far fa-check-circle" style="color:green"></i></td>
|
||||
{% else %}
|
||||
<td style="text-align:right"><i class="far fa-times-circle" style="color:red"></i></td>
|
||||
{% endif %}
|
||||
|
||||
</tr>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<footer class="main-footer">
|
||||
|
||||
<div class="float-right d-none d-sm-inline">
|
||||
Für die Nachwelt.
|
||||
</div>
|
||||
|
||||
<strong>Copyright © 2023 Siebenhirten
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script src="{% static 'plugins/jquery/jquery.min.js' %}"></script>
|
||||
<script src="{% static 'plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
|
||||
<script src="{% static 'dist/js/adminlte.min.js' %}"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$(".clickable-row").click(function() {
|
||||
window.location.href = $(this).data("href");
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
3
core/tests.py
Normal file
3
core/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
8
core/urls.py
Normal file
8
core/urls.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.core, name='core'),
|
||||
path('status/', views.status, name='status'),
|
||||
path('about/', views.about, name='about'),
|
||||
]
|
||||
29
core/views.py
Normal file
29
core/views.py
Normal file
@@ -0,0 +1,29 @@
|
||||
from django.shortcuts import render
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.http import HttpResponse
|
||||
from core.models import Video
|
||||
|
||||
# Create your views here.
|
||||
|
||||
def core(request):
|
||||
videos = Video.objects.all()
|
||||
return render(request, 'base.html', {'videos': videos})
|
||||
|
||||
|
||||
def status(request):
|
||||
highest_id = Video.objects.order_by('-id').first().id
|
||||
video_list = []
|
||||
|
||||
for i in range(highest_id + 1):
|
||||
try:
|
||||
video = Video.objects.get(id=i)
|
||||
video_list.append(video)
|
||||
except Video.DoesNotExist:
|
||||
video_list.append(Video(id=i))
|
||||
|
||||
return render(request, 'status.html', {'video_list': video_list[::-1]})
|
||||
|
||||
|
||||
|
||||
def about(request):
|
||||
return render(request, 'about.html')
|
||||
Reference in New Issue
Block a user