I am trying to make a ToDoList for every user.
I am using class based views and the auth User model. 

For Every User, there is a List model, consisting the List Name, and a Task 
model which is a child to the List.

I am having problem when I am updating a Task under a List.

I have my models.py, urls.py, views.py and the templates as follows.

models.py:

from django.db import models
from django.contrib.auth import get_user_model
from django.utils.text import slugify
from django.urls import reverse

User = get_user_model()
# Create your models here.
class List(models.Model):

    LIST_TYPES = [('daily','Daily'),
                    ('weekly','Weekly'),
                    ('monthly', 'Monthly'),
                    ('lifelong', 'Life Long')]
    list_type = models.CharField(max_length = 10, choices = LIST_TYPES)
    user = models.ForeignKey(User, related_name = 'list', on_delete = 
models.CASCADE)
    title = models.CharField(max_length = 32)
    slug = models.SlugField(allow_unicode = True, unique = True)
    created_at = models.DateTimeField(auto_now_add = True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save( *args, **kwargs)

    class Meta():
        ordering = ['title']

class Task(models.Model):

    list = models.ForeignKey(List, related_name = 'tasks', on_delete = 
models.CASCADE)
    user = models.ForeignKey(User, related_name = 'tasks', on_delete = 
models.CASCADE)
    name = models.CharField(max_length = 64)
    task_slug = models.SlugField(allow_unicode = True)
    completed = models.BooleanField(default = False)
    created_at = models.DateTimeField(auto_now_add = True)
    complete_before = models.DateTimeField()
    class Meta():
        ordering = ['complete_before']


    def __str__(self):
        return self.name

    def save(self,*args, **kwargs):
        self.task_slug = slugify(self.name)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('listApp:detail', kwargs={'slug':self.slug})



urls.py:-

from django.urls import path
from . import views

app_name = 'listApp'

urlpatterns = [
    path('', views.ListListView.as_view(), name = 'all'),
    path('create', views.ListCreateView.as_view(), name = 'create'),
    path('<slug:slug>', views.ListDetailView.as_view(), name = 'detail'),
    path('<slug:slug>/createtask', views.TaskCreateView.as_view(), name = 
'createtask'),
    path('<slug:slug>/updatetask/<slug:task_slug>', 
views.TaskUpdateView.as_view(), name = 'updatetask'),
    path('update/<slug:slug>', views.ListUpdateView.as_view(), 
name='update'),
    path('delete/<slug:slug>', views.ListDeleteView.as_view(), 
name='delete'),

]



views.py:-

from django.shortcuts import render
from django.views.generic import CreateView, ListView, DetailView, 
UpdateView, DeleteView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.utils.text import slugify
from braces.views import SelectRelatedMixin
from .forms import ListCreateForm,TaskCreateForm
from .models import List,Task


# Create your views here.
class ListCreateView(LoginRequiredMixin, CreateView):

    form_class = ListCreateForm
    success_url = reverse_lazy('listApp:all')
    template_name = 'listApp/list_form.html'

    def form_valid(self, form):
        self.object = form.save(commit = False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)

class ListListView(LoginRequiredMixin, ListView):

    model = List
    template_name = 'listApp/list_list.html'
    context_object_name = 'lists'

    def get_queryset(self):
        self.user = self.request.user
        return List.objects.filter(user=self.user)

class ListDetailView(LoginRequiredMixin, DetailView):

    model = List
    template_name = 'listApp/list_detail.html'
    context_object_name = 'list_detail'

class ListUpdateView(LoginRequiredMixin, UpdateView):
    model = List
    fields = ('title', 'list_type')
    template_name_suffix = '_update_form'
    success_url = reverse_lazy('listApp:all')
    #
    # def get_success_url(self):
    #     current_slug = self.kwargs['slug']
    #     return reverse_lazy('listApp:detail', kwargs={'slug': 
current_slug})

class ListDeleteView(LoginRequiredMixin, DeleteView):

    model = List
    template_name_suffix = '_check_delete'
    success_url = reverse_lazy('listApp:all')


class TaskCreateView(LoginRequiredMixin, CreateView):

    form_class = TaskCreateForm
    template_name = 'listApp/task_form.html'

    def form_valid(self, form):
        self.object = form.save(commit = False)
        self.object.user = self.request.user
        self.object.list = List.objects.get(slug=self.kwargs['slug'])
        self.object.save()
        return super().form_valid(form)

    def get_success_url(self):
        current_slug = self.kwargs['slug']
        return reverse_lazy('listApp:detail', kwargs={'slug': current_slug})


class TaskUpdateView(LoginRequiredMixin, UpdateView):

    model = Task
    template_name_suffix = '_update_form'
    fields = ('name','complete_before')

    def form_valid(self, form):
        self.object = form.save(commit = False)
        self.object.user = self.request.user
        self.object.list = List.objects.get(slug=self.kwargs['slug'])
        self.object.save()
        return super().form_valid(form)

    def get_success_url(self):
        current_slug = self.kwargs['slug']
        current_task_slug = self.kwargs['task_slug']
        return reverse_lazy('listApp:detail', kwargs={'slug': current_slug, 
'task_slug': current_task_slug})



Templates:-

list_detail.html:- 

<div class="container my-5 py-3">
    <h2>{{list_detail.title}}</h2>
    <p>Created: {{list_detail.created_at}}</p>

    <h3 class="d-inline">Tasks:</h3>
    <a class="btn btn-primary float-right d-inline" href="{% url 
'listApp:createtask' slug=list_detail.slug %}">Add Task</a>
    <div class="container mt-4">
      {% for task in list_detail.tasks.all %}
        <div class="container rounded" style="background-color:#bdc1c7;">
          {% if task.completed %}
            <input type="checkbox" class="d-inline" checked>
          {% else %}
            <input type="checkbox" class="d-inline">
          {% endif %}
          <h5 class="d-inline">{{task.name}}</h5>
          <a href="{% url 'listApp:updatetask' slug=list_detail.slug 
task_slug=task.task_slug %}"
              class="btn btn-warning btn-small float-right d-inline">Update 
Task</a>
          <p>Due Before:{{task.complete_before}} and 
Created:{{task.created_at}}</p>
        </div>
      {% endfor %}
    </div>
  </div>


task_update_form.html:-

{% extends "base.html" %}
{% load bootstrap4 %}
{% bootstrap_javascript jquery='full' %}

{% block head_content %}
  <title>{{user.first_name}}|Update Task</title>
{% endblock %}
{% block body_content %}
  <div class="container my-5 py-3">
    <h2>Update Task </h2>
    <form method="post">
      {% csrf_token %}
      {% bootstrap_form form %}
      {{ form.media }}
      <input type="submit" class="btn btn-warning mt-3" value="Update">
    </form>
  </div>

{% endblock %}




I have no idea as to why this error is occuring. Please Help.


-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/0dd4484f-0bee-46d1-8dec-1d9728b3ead0o%40googlegroups.com.

Reply via email to