Browse Source

Refactor base templates

pull/10/head
Hironsan 6 years ago
parent
commit
10e956ca09
4 changed files with 396 additions and 398 deletions
  1. 127
      app/server/templates/base.html
  2. 375
      app/server/templates/index.html
  3. 94
      app/server/templates/login.html
  4. 198
      app/server/templates/projects.html

127
app/server/templates/base.html

@ -1,80 +1,77 @@
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>doccano - Document Annotation Tool</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>doccano - Document Annotation Tool</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp"
crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.1/css/bulma.min.css" crossorigin="anonymous" />
<link rel="stylesheet" type="text/css" href="{% static 'css/forum.css' %}">
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.3.3/css/swiper.min.css">
{% block header %}{% endblock %}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp"
crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.1/css/bulma.min.css" crossorigin="anonymous"
/>
<link rel="stylesheet" href="{% static 'css/forum.css' %}">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.3.3/css/swiper.min.css">
{% block header %}{% endblock %}
</head>
<body>
<nav class="navbar has-shadow">
<div class="container">
<div class="navbar-brand">
<a class="navbar-item" href="{% url 'index' %}">
<img src="{% static 'images/logo.png' %}" width="32" height="32">
<b>doccano</b>
</a>
{% block navigation %}{% endblock %}
</div>
<div id="topNav" class="navbar-menu">
<div class="navbar-end">
<a class="navbar-item" href="{% url 'index' %}">
<span>Home</span>
</a>
{% if user.is_authenticated %}
<a class="navbar-item" href="{% url 'projects' %}">
<span>Projects</span>
</a>
{% endif %}
<!--<a class="navbar-item" href="hoge.html">Live Demo</a>-->
<a class="navbar-item" href="https://github.com/chakki-works/doccano">
<span>GitHub</span>
</a>
{% if not user.is_authenticated %}
<a class="navbar-item" href="{% url 'login' %}">
<span>Login</span>
</a>
{% else %}
<a class="navbar-item" href="{% url 'logout' %}">
<span>Logout</span>
</a>
{% endif %}
</div>
</div>
<nav class="navbar has-shadow">
<div class="container">
<div class="navbar-brand">
<a class="navbar-item" href="{% url 'index' %}">
<img src="{% static 'images/logo.png' %}" width="32" height="32">
<b>doccano</b>
</a>
{% block navigation %}{% endblock %}
</div>
<div id="topNav" class="navbar-menu">
<div class="navbar-end">
<a class="navbar-item" href="{% url 'index' %}">
<span>Home</span>
</a>
{% if user.is_authenticated %}
<a class="navbar-item" href="{% url 'projects' %}">
<span>Projects</span>
</a>
{% endif %}
<!--<a class="navbar-item" href="hoge.html">Live Demo</a>-->
<a class="navbar-item" href="https://github.com/chakki-works/doccano">
<span>GitHub</span>
</a>
{% if not user.is_authenticated %}
<a class="navbar-item" href="{% url 'login' %}">
<span>Login</span>
</a>
{% else %}
<a class="navbar-item" href="{% url 'logout' %}">
<span>Logout</span>
</a>
{% endif %}
</div>
</nav>
{% block content %} {% endblock %}
</div>
</div>
</nav>
{% block footer %}{% endblock %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.3.3/js/swiper.min.js"></script>
<script>
var mySwiper = new Swiper ('.swiper-container', {
// Optional parameters
loop: true,
autoplay: {
delay: 5000,
},
// Navigation arrows
navigation: {
{% block content %}{% endblock %}
{% block footer %}{% endblock %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.3.3/js/swiper.min.js"></script>
<script>
var mySwiper = new Swiper('.swiper-container', {
// Optional parameters
loop: true,
autoplay: {
delay: 5000,
},
// Navigation arrows
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
},
})
</script>
</script>
</body>
</html>

375
app/server/templates/index.html

@ -1,210 +1,211 @@
{% extends "base.html" %} {% load static %} {% block content %}
{% extends "base.html" %}
{% load static %}
{% block content %}
<section class="hero" style="background-color:#2a2e2f">
<div class="container">
<div class="columns">
<div class="column is-6">
<h1 class="title is-1 has-text-white">Text annotation for Human</h1>
<h2 class="subtitle is-4 has-text-white">Just create project, upload data and start annotation. You can build dataset in hours.</h2>
<p>
<a class="button is-medium is-primary">
Try Demo
</a>
</p>
</div>
<div class="column is-6">
<figure class="image">
<img src="{% static 'images/sequence_labeling.png' %}">
</figure>
</div>
</div>
<div class="container">
<div class="columns">
<div class="column is-6">
<h1 class="title is-1 has-text-white">Text annotation for Human</h1>
<h2 class="subtitle is-4 has-text-white">Just create project, upload data and start annotation. You can build dataset in hours.</h2>
<p>
<a class="button is-medium is-primary">
Try Demo
</a>
</p>
</div>
<div class="column is-6">
<figure class="image">
<img src="{% static 'images/sequence_labeling.png' %}">
</figure>
</div>
</div>
</div>
</section>
<div class="hero-body" style="background-image:linear-gradient(to bottom, #fafafa, #f3f3f3)">
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="columns is-vcentered">
<div class="column is-5 is-offset-1">
<figure class="image">
<img src="{% static 'images/sequence_labeling.png' %}" alt="Description">
</figure>
</div>
<div class="column is-5">
<h1 class="title is-2">
Document Classification
</h1>
<h2 class="subtitle is-4">
Document annotation for any document classification tasks.
</h2>
<br>
<p>
<a class="button is-primary">
Try Demo
</a>
</p>
</div>
</div>
</div>
<div class="swiper-slide">
<div class="columns is-vcentered">
<div class="column is-5 is-offset-1">
<figure class="image">
<img src="{% static 'images/sequence_labeling.png' %}" alt="Description">
</figure>
</div>
<div class="column is-5">
<h1 class="title is-2">
Sequence Labeling
</h1>
<h2 class="subtitle is-4">
A super easy interface to tag for named entity recognition, part-of-speech tagging, semantic role labeling.
</h2>
<br>
<p>
<a class="button is-primary">
Try Demo
</a>
</p>
</div>
</div>
</div>
<div class="swiper-slide">
<div class="columns is-vcentered">
<div class="column is-5 is-offset-1">
<figure class="image">
<img src="{% static 'images/sequence_labeling.png' %}" alt="Description">
</figure>
</div>
<div class="column is-5">
<h1 class="title is-2">
Sequence to Sequence
</h1>
<h2 class="subtitle is-4">
A super easy interface to label for any sequence to sequence tasks.
</h2>
<br>
<p>
<a class="button is-primary">
Try Demo
</a>
</p>
</div>
</div>
</div>
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="columns is-vcentered">
<div class="column is-5 is-offset-1">
<figure class="image">
<img src="{% static 'images/sequence_labeling.png' %}" alt="Description">
</figure>
</div>
<div class="column is-5">
<h1 class="title is-2">
Document Classification
</h1>
<h2 class="subtitle is-4">
Document annotation for any document classification tasks.
</h2>
<br>
<p>
<a class="button is-primary">
Try Demo
</a>
</p>
</div>
</div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
<div class="swiper-slide">
<div class="columns is-vcentered">
<div class="column is-5 is-offset-1">
<figure class="image">
<img src="{% static 'images/sequence_labeling.png' %}" alt="Description">
</figure>
</div>
<div class="column is-5">
<h1 class="title is-2">
Sequence Labeling
</h1>
<h2 class="subtitle is-4">
A super easy interface to tag for named entity recognition, part-of-speech tagging, semantic role labeling.
</h2>
<br>
<p>
<a class="button is-primary">
Try Demo
</a>
</p>
</div>
</div>
</div>
<div class="swiper-slide">
<div class="columns is-vcentered">
<div class="column is-5 is-offset-1">
<figure class="image">
<img src="{% static 'images/sequence_labeling.png' %}" alt="Description">
</figure>
</div>
<div class="column is-5">
<h1 class="title is-2">
Sequence to Sequence
</h1>
<h2 class="subtitle is-4">
A super easy interface to label for any sequence to sequence tasks.
</h2>
<br>
<p>
<a class="button is-primary">
Try Demo
</a>
</p>
</div>
</div>
</div>
</div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
</div>
<div class="hero-body" style="background-image:linear-gradient(to bottom, #fafafa, #f3f3f3)">
<div class="container">
<div class="container">
<div class="columns features">
<div class="column is-4">
<div class="card is-shady">
<div class="card-image">
<figure class="image is-4by3">
<img src="https://source.unsplash.com/RWnpyGtY1aU" alt="Placeholder image" class="modal-button" data-target="modal-image2">
</figure>
</div>
<div class="card-content">
<div class="content">
<h4>Team Collaboration</h4>
<p>Invite other users to help you annotate text and create an annotated corpus. You only have to
create a guideline and upload text data. Team collaboration can accelate annotation process.
</p>
</div>
</div>
</div>
<div class="columns features">
<div class="column is-4">
<div class="card is-shady">
<div class="card-image">
<figure class="image is-4by3">
<img src="https://source.unsplash.com/RWnpyGtY1aU" alt="Placeholder image" class="modal-button" data-target="modal-image2">
</figure>
</div>
<div class="card-content">
<div class="content">
<h4>Team Collaboration</h4>
<p>Invite other users to help you annotate text and create an annotated corpus. You only have to create a guideline
and upload text data. Team collaboration can accelate annotation process.
</p>
</div>
<div class="column is-4">
<div class="card is-shady">
<div class="card-image">
<figure class="image is-4by3">
<img src="https://source.unsplash.com/6Ticnhs1AG0" alt="Placeholder image">
</figure>
</div>
<div class="card-content">
<div class="content">
<h4>Language independent</h4>
<p>doccano is not dependent on any languages. You can annotate any languages such as English, Spanish,
Chinese and so on. Regardless of your language, you can quickly start annotating text.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="column is-4">
<div class="card is-shady">
<div class="card-image">
<figure class="image is-4by3">
<img src="https://source.unsplash.com/6Ticnhs1AG0" alt="Placeholder image">
</figure>
</div>
<div class="card-content">
<div class="content">
<h4>Language independent</h4>
<p>doccano is not dependent on any languages. You can annotate any languages such as English, Spanish, Chinese
and so on. Regardless of your language, you can quickly start annotating text.</p>
</div>
<div class="column is-4 modal-button" data-target="modal-image">
<div class="card is-shady">
<div class="card-image">
<figure class="image is-4by3">
<img src="https://i.imgsafe.org/ba/baa924a5e3.png" alt="Placeholder image">
</figure>
</div>
<div class="card-content">
<div class="content">
<h4>Active learning</h4>
<p>Active learning is one of the most powerful tools in creating annotated corpora. Machine learning
model automatically annotates texts. You're only asked to judge whether the examples are
correct or not.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="column is-4 modal-button" data-target="modal-image">
<div class="card is-shady">
<div class="card-image">
<figure class="image is-4by3">
<img src="https://i.imgsafe.org/ba/baa924a5e3.png" alt="Placeholder image">
</figure>
</div>
<div class="card-content">
<div class="content">
<h4>Active learning</h4>
<p>Active learning is one of the most powerful tools in creating annotated corpora. Machine learning model automatically
annotates texts. You're only asked to judge whether the examples are correct or not.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<div class="columns">
<div class="column is-4">
<h2>
<strong class="has-text-white">DOCCANO</strong>
</h2>
<ul>
<li>
<a href="#">Documentation</a>
</li>
<li>
<a href="#">Live Demo</a>
</li>
<li>
<a href="#">Source code</a>
</li>
<li>
<a href="#">Contribution</a>
</li>
</ul>
</div>
<div class="column is-4">
<h2>
<strong class="has-text-white">FEATURES</strong>
</h2>
<ul>
<li>
<a href="#">Text Classification</a>
</li>
<li>
<a href="#">Sequence Labeling</a>
</li>
<li>
<a href="#">Sequence to Sequence</a>
</li>
</ul>
</div>
</div>
<div class="content has-text-centered">
<p>
<a href="https://github.com/chakki-works/doccano">doccano</a> by
<a href="https://github.com/Hironsan">Hironsan</a>. The source code is licensed
<a href="http://opensource.org/licenses/mit-license.php">MIT</a>.
<br>
</p>
</div>
<div class="container">
<div class="columns">
<div class="column is-4">
<h2>
<strong class="has-text-white">DOCCANO</strong>
</h2>
<ul>
<li>
<a href="#">Documentation</a>
</li>
<li>
<a href="#">Live Demo</a>
</li>
<li>
<a href="#">Source code</a>
</li>
<li>
<a href="#">Contribution</a>
</li>
</ul>
</div>
<div class="column is-4">
<h2>
<strong class="has-text-white">FEATURES</strong>
</h2>
<ul>
<li>
<a href="#">Text Classification</a>
</li>
<li>
<a href="#">Sequence Labeling</a>
</li>
<li>
<a href="#">Sequence to Sequence</a>
</li>
</ul>
</div>
</div>
<div class="content has-text-centered">
<p>
<a href="https://github.com/chakki-works/doccano">doccano</a> by
<a href="https://github.com/Hironsan">Hironsan</a>. The source code is licensed
<a href="http://opensource.org/licenses/mit-license.php">MIT</a>.
<br>
</p>
</div>
</div>
</footer>
{% endblock %}

94
app/server/templates/login.html

@ -1,54 +1,56 @@
{% extends "base.html" %} {% load widget_tweaks %} {% block content %}
{% extends "base.html" %}
{% load widget_tweaks %}
{% block content %}
<section class="hero container has-text-centered">
<div class="columns hero-body">
<div class="column is-4 is-offset-4">
<div class="box has-text-left">
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %} {% if next %} {% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed, please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %} {% endif %}
<div class="columns hero-body">
<div class="column is-4 is-offset-4">
<div class="box has-text-left">
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %} {% if next %} {% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed, please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %} {% endif %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<div class="field ">
<label class="label">Username</label>
<div class="control has-icons-left has-icons-right">
{{ form.username|add_class:"input" }}
<span class="icon is-small is-left">
<i class="fas fa-user"></i>
</span>
<span class="icon is-small is-right">
<i class="fas fa-check"></i>
</span>
</div>
</div>
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<div class="field ">
<label class="label">Username</label>
<div class="control has-icons-left has-icons-right">
{{ form.username|add_class:"input" }}
<span class="icon is-small is-left">
<i class="fas fa-user"></i>
</span>
<span class="icon is-small is-right">
<i class="fas fa-check"></i>
</span>
</div>
</div>
<div class="field">
<label class="label">Password</label>
<div class="control has-icons-left has-icons-right">
{{ form.password|add_class:"input"}}
<span class="icon is-small is-left">
<i class="fas fa-lock"></i>
</span>
<span class="icon is-small is-right">
<i class="fas fa-check"></i>
</span>
</div>
</div>
<div class="field">
<label class="checkbox">
<input type="checkbox"> Remember me
</label>
</div>
<input class="button is-block is-primary is-middle is-fullwidth" type="submit" value="Login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
<div class="field">
<label class="label">Password</label>
<div class="control has-icons-left has-icons-right">
{{ form.password|add_class:"input"}}
<span class="icon is-small is-left">
<i class="fas fa-lock"></i>
</span>
<span class="icon is-small is-right">
<i class="fas fa-check"></i>
</span>
</div>
</div>
</div>
<div class="field">
<label class="checkbox">
<input type="checkbox"> Remember me
</label>
</div>
<input class="button is-block is-primary is-middle is-fullwidth" type="submit" value="Login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
</div>
</div>
</div>
</section>
{% endblock %}

198
app/server/templates/projects.html

@ -1,113 +1,111 @@
{% extends "base.html" %} {% load static %}
{% extends "base.html" %}
{% load static %}
{% load widget_tweaks %}
{% block content %}
<div id="projects_root">
<section class="hero project-image">
<div class="container">
<div class="columns">
<div class="column is-12">
<h1 class="title is-1 has-text-white">
Hello, {{ user.get_username | title }}.
</h1>
<h2 class="subtitle is-4 has-text-white">
I hope you are having a great day!
</h2>
{% if user.is_superuser %}
<p>
<a class="button is-medium is-primary" @click="isActive=!isActive">
Create Project
</a>
</p>
{% endif %}
</div>
</div>
<section class="hero project-image">
<div class="container">
<div class="columns">
<div class="column is-12">
<h1 class="title is-1 has-text-white">
Hello, {{ user.get_username | title }}.
</h1>
<h2 class="subtitle is-4 has-text-white">
I hope you are having a great day!
</h2>
{% if user.is_superuser %}
<p>
<a class="button is-medium is-primary" @click="isActive=!isActive">
Create Project
</a>
</p>
{% endif %}
</div>
</section>
</div>
</div>
</section>
<div class="container">
<div class="columns" style="margin-top:0">
<div class="column is-3">
<aside class="menu">
<p class="menu-label">
Categories
</p>
<ul class="menu-list">
<li>
<a v-bind:class="{active: selectedType == 'All' }" v-on:click="updateSelectedType('All')">All</a>
</li>
<li v-for="t in uniqueProjectTypes">
<a v-bind:class="{active: t == selectedType }" v-on:click="updateSelectedType(t)">[[ t ]]</a>
</li>
</ul>
</aside>
</div>
<div class="column is-9">
<!-- Modal card for creating project. -->
<div class="modal" :class="{ 'is-active': isActive }">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">Create Project</p>
<button class="delete" aria-label="close" @click="isActive=!isActive"></button>
</header>
<form method="post">
{% csrf_token %}
<section class="modal-card-body">
{% for hidden_field in form.hidden_fields %}
{{ hidden_field }}
{% endfor %}
{% for field in form.visible_fields %}
<div class="field">
{{ field.label_tag }}
<div class="control">
{% render_field field class="input select-height" %}
</div>
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text }}</small>
{% endif %}
</div>
{% endfor %}
</section>
<footer class="modal-card-foot" style="background-color:#dbdbdb !important;padding:20px !important;">
<button class="button is-primary">Create</button>
<button class="button" @click="isActive=!isActive">Cancel</button>
</footer>
</form>
</div>
<div class="container">
<div class="columns" style="margin-top:0">
<div class="column is-3">
<aside class="menu">
<p class="menu-label">
Categories
</p>
<ul class="menu-list">
<li>
<a v-bind:class="{active: selectedType == 'All' }" v-on:click="updateSelectedType('All')">All</a>
</li>
<li v-for="t in uniqueProjectTypes">
<a v-bind:class="{active: t == selectedType }" v-on:click="updateSelectedType(t)">[[ t ]]</a>
</li>
</ul>
</aside>
</div>
<div class="column is-9">
<!-- Modal card for creating project. -->
<div class="modal" :class="{ 'is-active': isActive }">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">Create Project</p>
<button class="delete" aria-label="close" @click="isActive=!isActive"></button>
</header>
<form method="post">
{% csrf_token %}
<section class="modal-card-body">
{% for hidden_field in form.hidden_fields %} {{ hidden_field }} {% endfor %} {% for field in form.visible_fields %}
<div class="field">
{{ field.label_tag }}
<div class="control">
{% render_field field class="input select-height" %}
</div>
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text }}</small>
{% endif %}
</div>
{% endfor %}
</section>
<footer class="modal-card-foot" style="background-color:#dbdbdb !important;padding:20px !important;">
<button class="button is-primary">Create</button>
<button class="button" @click="isActive=!isActive">Cancel</button>
</footer>
</form>
</div>
</div>
<div class="columns features" v-for="projects in filteredProjects">
<div class="column is-4" v-for="project in projects">
<div class="card is-shady">
<div class="card-image">
<figure class="image is-4by3">
<img v-bind:src="project.image" alt="Placeholder image">
</figure>
</div>
<div class="card-content">
<div class="content">
<h4>
<a v-bind:href="'/projects/' + project.id">[[ project.name ]]</a>
</h4>
<p>
[[ project.description.slice(0, 50) ]]
</p>
</div>
</div>
{% if user.is_superuser %}
<div class="card-footer">
<a v-bind:href="'/projects/' + project.id + '/docs'" class="card-footer-item">Edit</a>
<a href="" class="card-footer-item has-text-danger" style="font-weight:700">Delete</a>
</div>
{% endif %}
</div>
</div>
<div class="columns features" v-for="projects in filteredProjects">
<div class="column is-4" v-for="project in projects">
<div class="card is-shady">
<div class="card-image">
<figure class="image is-4by3">
<img v-bind:src="project.image" alt="Placeholder image">
</figure>
</div>
<div class="card-content">
<div class="content">
<h4>
<a v-bind:href="'/projects/' + project.id">[[ project.name ]]</a>
</h4>
<p>
[[ project.description.slice(0, 50) ]]
</p>
</div>
</div>
{% if user.is_superuser %}
<div class="card-footer">
<a v-bind:href="'/projects/' + project.id + '/docs'" class="card-footer-item">Edit</a>
<a href="" class="card-footer-item has-text-danger" style="font-weight:700">Delete</a>
</div>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %} {% block footer %}
<script type="text/javascript" src="{% static 'bundle/projects.js' %}"></script>
{% endblock %}
{% block footer %}
<script src="{% static 'bundle/projects.js' %}"></script>
{% endblock %}
Loading…
Cancel
Save