Cannot resolve keyword 'slug' into field.

234 views
Skip to first unread message

Ateequr Rahman

unread,
Jun 10, 2020, 8:51:36 AM6/10/20
to Django users
I trying to develop  a ToDoList using Django. For every user there is a List model and in each List there are several Task(model). 
I am using django auth User model and Class based views to Create, Update and Delete Lists and Tasks.

I successfully created, updated and deleted List. But am facing problems when updating Task. I am using slug for both List and Task.

I am facing this error (Cannot resolve keyword 'slug' into field.) when getting the update_form page. 

Please help. The following are the codes for my project:

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(for app):-
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 %}



Ateequr Rahman

unread,
Jun 10, 2020, 8:51:39 AM6/10/20
to Django users
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.
urls.py:-
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.


Reply all
Reply to author
Forward
0 new messages