Django Детальный просмотр запроса - фильтрация по полю textchoices объектов внешнего ключа - PullRequest
0 голосов
/ 06 марта 2020

У меня есть следующие 2 модели - ToDoList и Tasks. Задачи имеет внешний ключ к модели ToDoList. В моем подробном представлении я хочу показать только те задачи, которые опубликованы (status = "опубликовано").

Я попытался переопределить получение данных контекста представления. Это сработало. Но он вообще не отображает экземпляры задач в подробном представлении, хотя у меня, например, задание 1 установлено как «опубликованное».

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

class ToDoList(TimeStamp):


    class STATUS(models.TextChoices): 
        PUBLISHED = "published", "Published" 
        TRASH = "trash", "Trash"
        WORKINGDRAFT = "workingdraft", "Workingdraft" 


    headline = models.CharField(max_length=200)
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    status = models.CharField("Status", max_length=20, choices=STATUS.choices, default=STATUS.PUBLISHED)



    def __str__(self):
        return self.headline

    def get_absolute_url(self):
        return reverse('notepad:todo_detail', args=[str(self.id)])


class Tasks(TimeStamp):

    class STATUS(models.TextChoices): 
        PUBLISHED = "published", "Published" 
        TRASH = "trash", "Trash"
        WORKINGDRAFT = "workingdraft", "Workingdraft" 


    todos = models.CharField(max_length=250)
    todolist = models.ForeignKey(ToDoList, on_delete=models.CASCADE, related_name='tasks')
    status = models.CharField("Status", max_length=20, choices=STATUS.choices, default=STATUS.PUBLISHED)


    def __str__(self):
        return self.todos

views.py

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponseRedirect
from django.forms.models import inlineformset_factory
from django.views.generic import ListView, DetailView, TemplateView
from django.views.generic.edit import CreateView
from django.urls import reverse
from django.urls import reverse_lazy

from .models import ToDoList, Tasks
from .forms import ToDoListForm

class ToDoDetailView(DetailView):
    model = ToDoList
    template_name = 'notepad/notepad_detail.html'

    def get_context_data(self,**kwargs):
        context = super(ToDoDetailView,self).get_context_data(**kwargs)
       context['tasks_published'] = self.object.tasks.filter(status="published")
        return context    

    def get_object(self):
        object = super(ToDoDetailView, self).get_object()
        object.num_tasks = object.tasks.all().count()
        return object

template

<!-- templates/books/book_detail.html -->
{% extends 'base.html' %}

{% block title %}{{ object.headline }}{% endblock title %}

{% block content %}
<div class="book-detail">
<h2><a href="">{{ object.headline }}</a></h2> 
<p>Author: {{ object.author }}</p> 
<p>Created at: {{ object.created }}</p>

<p>Total Tasks: {{ object.num_tasks }}</p>



<div>
    <h3>Tasks</h3> <ul>
    {% for todo in tasks_published %}
    <li>{{ todo.todos }}</li> 
    {% endfor %}
    </ul> </div>
</div>

<a class="btn btn-primary"
href="{% url 'notepad:todo_list' %}" role="button">
Back to ToDo List
</a> </p>
{% endblock content %}

Любая помощь будет принята с благодарностью. Заранее большое спасибо за ваше время и поддержку.

Ответы [ 2 ]

1 голос
/ 06 марта 2020

попробуйте следующий кортеж выбора в вашем CharField измените атрибут выбора, чтобы я дал кортеж

#define_tuple
PUBLISHED = (
    ('published','Published'),
    ('trash','Trash'),
    ('workingdraft','Workingdraft'),
)

class ToDoList(TimeStamp):
    headline = models.CharField(max_length=200)
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    #change in following line 
    status = models.CharField("Status", max_length=20, choices=PUBLISHED, default='published') #here change

    def __str__(self):
        return self.headline

Попробуйте в обеих моделях и убедитесь, что он работает идеально или нет, дайте мне знать

1 голос
/ 06 марта 2020

Пожалуйста, попробуйте:

def get_context_data(self,**kwargs):
    context = super(ToDoDetailView,self).get_context_data(**kwargs)
    context['tasks_published'] = self.object.tasks.filter(status=STATUS.PUBLISHED)
    return context 

Поскольку в вашем коде у вас будет список экземпляров ToDoList вместо задач. А в DetailView () вам нужно увидеть опубликованные задачи для текущего TodoList, верно?

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