Translate

Python | ToDo webapp using Django and sqlite3 database

 

Python | ToDo webapp using Django

Prerequisite : django installation
Django is a high-level Python Web framework based web framework that allows rapid development and clean, pragmatic design. today we will create a todo app created to understand the basics of Django. In this web app, one can create notes like Google Keep or Evernote.
Modules required : 
 

pip install --upgrade django-crispy-forms

basic setup :
Start a project by the following command – 
 

django-admin startproject todo-site

Change directory to todo-site – 
 

cd todo-site

Start the server- Start the server by typing following command in terminal – 
 

python manage.py runserver

To check whether the server is running or not go to a web browser and enter http://127.0.0.1:8000/ as URL.
Now stop the server by pressing 

ctrl-c

Let’s create an app now.
 

python manage.py startapp todo

Goto todo/ folder by doing : cd todo and create a folder with index.html file : templates/todo/index.html
Open the project folder using a text editor. The directory structure should look like this :
 

Now add todo app and crispty_form in your todo_site in settings.py.
 

Edit urls.py file in todo_site :
 

from django.contrib import admin
from django.urls import path
from todo import views
 
urlpatterns = [
    #####################home_page###########################################
    path('', views.index, name="todo"),
    ####################give id no. item_id name or item_id=i.id ############
    # pass item_id as primary key to remove that the todo with given id
    path('del/<str:item_id>', views.remove, name="del"),
    ########################################################################
    path('admin/', admin.site.urls),
]

Edit models.py in todo : 
 

from django.db import models
from django.utils import timezone
 
class Todo(models.Model):
    title=models.CharField(max_length=100)
    details=models.TextField()
    date=models.DateTimeField(default=timezone.now)
 
    def __str__(self):
        return self.title

Edit views.py in todo :
 

from django.shortcuts import render, redirect
from django.contrib import messages
 
## import todo form and models
 
from .forms import TodoForm
from .models import Todo
 
###############################################
 
def index(request):
 
    item_list = Todo.objects.order_by("-date")
    if request.method == "POST":
        form = TodoForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('todo')
    form = TodoForm()
 
    page = {
             "forms" : form,
             "list" : item_list,
             "title" : "TODO LIST",
           }
    return render(request, 'todo/index.html', page)
 
 
 
### function to remove item, it receive todo item_id as primary key from url ##
def remove(request, item_id):
    item = Todo.objects.get(id=item_id)
    item.delete()
    messages.info(request, "item removed !!!")
    return redirect('todo')

Now create a forms.py in todo : 
 

from django import forms
from .models import Todo
 
class TodoForm(forms.ModelForm):
    class Meta:
        model = Todo
        fields="__all__"

Register models to admin : 
 

Navigate to templates/todo/index.html and edit it : link to index.html file
Make migrations and migrate it 
 

python manage.py makemigrations
python manage.py migrate

Now you can run the server to see your todo app 
 

python manage.py runserver

 

 

 index.html

 ```

<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>

<meta charset="utf-8">
<title>{{title}}</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<!--style-->
<style>
.card {

box-shadow: 0 4px 8px 0 rgba(0,0,0,0.5),
0 6px 20px 0 rgba(0,0,0,0.39);
background: lightpink;
margin-bottom : 5%;
border-radius: 25px;
padding : 2%;
overflow: auto;
resize: both;
text-overflow: ellipsis;
}
.card:hover{
background: lightblue;
}

.submit_form{

text-align: center;
padding: 3%;
background: pink;
border-radius: 25px;
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.4),
0 6px 20px 0 rgba(0,0,0,0.36);
}
</style>

</head>

<body class="container-fluid">

{% if messages %}
{% for message in messages %}
<div class="alert alert-info">
<strong>{{message}}</strong>
</div>
{% endfor %}
{% endif %}

<center class="row">
<h1><i>__TODO LIST__</i></h1>
<hr />
</center>

<div class="row">

<div class="col-md-8">

{% for i in list %}
<div class="card">
<center><b>{{i.title}}</b></center>
<hr/>
{{i.date}}
<hr/>
{{i.details}}
<br />
<br />
<form action="/del/{{i.id}}" method="POST" style=" padding-right: 4%; padding-bottom: 3%;">
{% csrf_token %}
<button value="remove" type="submit" class="btn btn-primary" style="float: right;"><span class="glyphicon glyphicon-trash"></span> &nbsp; remove</button>
</form>
</div>
{% endfor%}
</div>
<div class="col-md-1"> </div>
<div class="col-md-3" >
<div class="submit_form">
<form method="POST">
{% csrf_token %}
{{forms|crispy}}
<center>
<input type="submit" class="btn btn-default" value="submit" />
</center>
</form>
</div>
</div>
</div>
</body>

</html>
{% load crispy_forms_tags %}

```` 

 

if you are facing an error templtes not found then please refer below

Find this tuple:

    import os
    SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]

You need to add to 'DIRS' the string

os.path.join(SETTINGS_PATH, 'templates')

So altogether you need:

 import os
 SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

 

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(SETTINGS_PATH, 'mysite/templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


complete source code - https://github.com/rabiyulfahimhasim786/django_resources_/tree/main/django-todoapp-site/mysite

 reference-  geeksforgeeks.org

 

Comments

Popular Posts

bot

Popular post