Как фильтровать задачи по категориям в django / boostrap? - PullRequest
0 голосов
/ 13 июля 2020

Я следовал этому руководству: https://medium.com/fbdevclagos/how-to-build-a-todo-app-with-django-17afdc4a8f8c, чтобы создать список задач.

Я хотел бы отображать каждую задачу по категориям. Обычно я использую фильтр в своих представлениях, если хочу отобразить только логическую модель. Поскольку категория изначально не определена и является символом, как мне отфильтровать задачи на основе категории, каким бы ни было имя.

(я знаю, что функция taskDelete не работает и возвращает ошибку)

models.py

class Category(models.Model): # The Category table name that inherits models.Model
    name = models.CharField(max_length=100) #Like a varchar
    class Meta:
        verbose_name = ("Category")
        verbose_name_plural = ("Categories")
    def __str__(self):
        return self.name #name to be shown when called

class TodoList(models.Model): #Todolist able name that inherits models.Model
    title = models.CharField(max_length=250) # a varchar
    content = models.TextField(blank=True) # a text field 
    comment = models.TextField(blank=True) # a text field
    created = models.DateField(default=timezone.now().strftime("%Y-%m-%d")) # a date
    due_date = models.DateField(default=timezone.now().strftime("%Y-%m-%d")) # a date
    category = models.ForeignKey(Category, on_delete=models.CASCADE, default="general") # a foreignkey
    complete = models.BooleanField(default=False)
    class Meta:
        ordering = ["-created"] #ordering by the created field
    def __str__(self):
        return self.title #name to be shown when called

views.py

def check_list(request):
    todos = TodoList.objects.all() #querying all todos with the object manager
    categories = Category.objects.all() #getting all categories with object manager
    if request.method == "POST": #checking if the request method is a POST
        if "taskAdd" in request.POST: #checking if there is a request to add a todo
            title = request.POST["description"] #title
            date = str(request.POST["date"]) #date
            category = request.POST["category_select"] #category
            content = title + " -- " + date + " " + category #content
            Todo = TodoList(title=title, content=content, due_date=date, category=Category.objects.get(name=category))
            Todo.save() #saving the todo 
            return redirect("/") #reloading the page
        if "taskDelete" in request.POST: #checking if there is a request to delete a todo            
            checkedlist = request.POST["checkedbox"] #checked todos to be deleted
            for todo_id in checkedlist:
                todo = TodoList.objects.get(id=todo_id) #getting todo id
                todo = get_object_or_404(Todo, pk=todo_id)
                todo.delete() #deleting todo
                messages.info(request, "item removed !!!")         
    return render(request, 'marketing/check_list.html',{"todos": todos, "categories":categories})

check_list. html

<div class="container-fluid">
        <div class="row">
            {% for category in categories %}
            <div class="col-sm-3 col-md-3">
                <div class="card">
                    <div class="card-header">
                        <div class="row">
                            <div class="col col-xs-1">
                                <h4 class="card-title">{{ category.name }}</h4>
                            </div>

                        </div>                        
                    </div>
                    <div class="card-body">                       
                            {% for todo in todos %} <!-- django template lang - for loop -->                      
                            <div class="row">    
                                <div class="col">
                                    <input type="checkbox" class="taskCheckbox" name="checkedbox" id="{{ todo.id }}" value="{{ todo.id }}">
                                    <label for="{{ todo.id }}"><span class="complete-">{{ todo.title }}</span></label>
                                </div>
                                <div class="col text-right">                                        
                                    <strong class="taskDate">{{ todo.due_date }}</strong>
                                </div>
                            </div>                           
                            {% endfor %}                                                                 
                    </div>
                </div>  
            </div>
            {% endfor %}         
        </div>
    </div>
</div>

Большое спасибо

1 Ответ

0 голосов
/ 13 июля 2020

Поскольку каждый TodoList имеет один category, в вашем шаблоне в category l oop, вы можете l oop вместо TodoList каждой категории

{% for category in categories %}
     some code
     {% for todo in category.TodoList_set.all %}

     {% endfor %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...