Django Detail视图查询-按外键对象文本选择字段筛选



我有以下两个模型-ToDoList和Tasks。Tasks具有ToDoList模型的Foreignkey。在我的Detailview中,我只想显示已发布的任务(状态="已发布"(。

我试图覆盖视图的获取上下文数据。这起到了作用。但是它根本没有在Detailview中显示任何任务实例,即使我有一个任务集,例如"已发布"。

我还尝试在模板中执行筛选条件。我想这不可能吧?我或多或少确信筛选条件必须出现在查询集中。

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

模板

<!-- 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 %}

如有任何帮助,我们将不胜感激。提前非常感谢您的时间和支持。

请尝试:

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的已发布任务,对吗?

尝试在CharField中将choice属性更改为i给定元组

#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

在两种型号中都试用,并检查其工作是否完美。请告诉我

最新更新