0

I am trying to create a todo website. In that all the users will have their own list of Todos. But it is showing the same list to all the users and also, other users can edit,delete and add to the todo-list which is again visible to all the users.

models.py

from django.db import models
from django.contrib.auth import get_user_model
from django.conf import settings


class todo (models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete="models.CASCADE")
    todo_topic = models.CharField (max_length = 50)
    todo_description = models.TextField(max_length=100)
    todo_date = models.DateTimeField(null = True)
    date_added = models.DateTimeField(auto_now = True,)
    completed_or_not = models.CharField(choices=(('Done', 'Done'), ('Not Done', 'Not Done')), default = 'Not Done', max_length=10)

views.py

from django.shortcuts import render
from .models import todo
from .forms import addTodo_form, edit_form
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth.decorators import login_required

def dashboard(request):
    if request.user.is_authenticated:
        todo_list = todo.objects.order_by('-date_added')
        template = 'customers/dashboard.html'
        return render (request, template, {'todo_list' : todo_list})
    else :
        return render (request, 'customers/home.html')

@login_required
def addTodo(request):
    if request.method == 'POST' :
        form = addTodo_form(request.POST)
        if form.is_valid():
            topic = form.cleaned_data['topic']
            des = form.cleaned_data['description']
            date = form.cleaned_data['todo_date']
            #user = User.objects.get(username=request.user.username)
            user=request.user
            gta = user.todo_set.create(todo_topic = topic, todo_description = des, todo_date = date)
            message = 'Item Added To Your Todo List'
            return render(request, 'customers/add.html', {'form' : form, 'msg' : message})
    else :
        form = addTodo_form()
    return render(request, 'customers/add.html', {'form' : form})

@login_required
def showForm(request, id):
    a = todo.objects.get(pk=id)
    data_dict = {'topic' : a.todo_topic, 'description' : a.todo_description, 'todo_date' : a.todo_date, 'completed_or_not' : a.completed_or_not}
    form = edit_form(initial = data_dict)
    return render(request, 'customers/edit.html', {'form' : form, 'date_added' : a.date_added})

@login_required
def edit(request, date_added):
    if request.method == 'POST':
        form = edit_form(request.POST)
        if form.is_valid():
            topic = form.cleaned_data['topic']
            des = form.cleaned_data['description']
            date = form.cleaned_data['todo_date']
            status = form.cleaned_data['completed_or_not']
            instance = todo.objects.get(date_added = date_added)
            instance.todo_topic = topic
            instance.todo_description = des
            instance.todo_date = date
            instance.completed_or_not = status
            instance.save(update_fields=['todo_topic', 'todo_description', 'todo_date', 'completed_or_not'])
            message = 'Updated'
            return HttpResponseRedirect(reverse ('dashboard'))

@login_required
def delete(request, id):
    todo.objects.get(pk=id).delete()
    return HttpResponseRedirect(reverse('dashboard'))

forms.py

from django import forms

class SignUpForm(forms.Form):
    first_name = forms.CharField(max_length = 20, label = 'First Name', required = True)
    last_name = forms.CharField(max_length = 20, label = 'Last Name', required = True)

    def signup(self, request, user):
        user.first_name : self.cleaned_data['first_name']
        user.last_name : self.cleaned_data['last_name']
        user.save()

class addTodo_form(forms.Form):
    topic = forms.CharField(label = 'Topic', max_length=50, required = True)
    description = forms.CharField(widget=forms.Textarea, label = 'Description', max_length=100)
    todo_date = forms.DateField (label = 'Date', widget=forms.SelectDateWidget)


class edit_form(forms.Form):
    topic = forms.CharField(label = 'Topic', max_length=50, required = True)
    description = forms.CharField(widget=forms.Textarea, label = 'Description', max_length=100)
    todo_date = forms.DateField (label = 'Date', widget=forms.SelectDateWidget)
    completed_or_not = forms.ChoiceField(choices = (
                                            ('Done', 'Done'),
                                            ('Not Done', 'Not Done'),
                                            ))

Project_Directory

project_directory
├───static
│   ├───media
│   ├───static
│   │   ├───css
│   │   └───js
│   └───static-only
│       ├───admin
│       │   ├───css
│       │   │   └───vendor
│       │   │       └───select2
│       │   ├───fonts
│       │   ├───img

│       │   │   └───gis
│       │   └───js
│       │       ├───admin
│       │       └───vendor
│       │           ├───jquery
│       │           ├───select2
│       │           │   └───i18n
│       │           └───xregexp
│       ├───css
│       └───js
└───todo_website
    ├───customers
    │   ├───migrations
    │   │   └───__pycache__
    │   ├───templates
    │   │   ├───account
    │   │   └───customers
    │   └───__pycache__
    └───todo_website
        └───__pycache__

The problem is, i logged in with user1 and created a todo list and then i logged out. I, again, logged in with user2 and there i see that the list created by user1 is already present Even when i create a new account and logged in, the list created by user1 is present there.

Vaibhav Gupta
  • 650
  • 7
  • 15

1 Answers1

1

You are retrieving all the objects. Filter the todos by user and show only the ones created by that user.

todo_list = todo.objects.filter(user=request.user).order_by('-date_added')
MD. Khairul Basar
  • 4,976
  • 14
  • 41
  • 59