Django详细视图查询-按外键对象筛选textchoices字段
我有以下两个模型-ToDoList和Tasks。Tasks具有ToDoList模型的Foreignkey。在我的Detailview中,我只想显示已发布的任务(status=“published”) 我试图覆盖视图的获取上下文数据。这起作用了。但它在Detailview中根本不显示任何任务实例,即使我将示例1任务设置为“已发布” 我还尝试在模板中执行筛选条件。我想这是不可能的?我或多或少确定筛选条件必须出现在查询集中Django详细视图查询-按外键对象筛选textchoices字段,django,django-views,django-templates,Django,Django Views,Django Templates,我有以下两个模型-ToDoList和Tasks。Tasks具有ToDoList模型的Foreignkey。在我的Detailview中,我只想显示已发布的任务(status=“published”) 我试图覆盖视图的获取上下文数据。这起作用了。但它在Detailview中根本不显示任何任务实例,即使我将示例1任务设置为“已发布” 我还尝试在模板中执行筛选条件。我想这是不可能的?我或多或少确定筛选条件必须出现在查询集中 class ToDoList(TimeStamp): class
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 %}
{%extends'base.html%}
{%block title%}{{object.headline}{%endblock title%}
{%block content%}
作者:{{object.Author}}
创建时间:{{object.Created}
任务总数:{{object.num_Tasks}
任务
{任务中todo的%u已发布%}
- {{todo.todos}}
{%endfor%}
{%endblock内容%}
任何帮助都将不胜感激。
非常感谢您的时间和支持。请尝试:
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的已发布任务,对吗?请尝试:
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 tuple中执行以下操作,将choices属性更改为i give tuple
#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
在这两种模型中都进行尝试,并检查其工作是否完美让我知道在您的
CharField
中尝试以下选项元组,将选项属性更改为i give tuple
#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
在两种型号中都试用,并检查其工作是否完美,请告诉我非常感谢。这给了我以下错误:未定义名称“STATUS”。但是“自我、目标、任务”是我错过的。正确的查询是:context['tasks\u published']=self.object.tasks.filter(status=“published”)。我编辑我的问题。尝试在视图中导入状态非常感谢。这给了我以下错误:未定义名称“STATUS”。但是“自我、目标、任务”是我错过的。正确的查询是:context['tasks\u published']=self.object.tasks.filter(status=“published”)。我编辑我的问题。尝试在视图中导入状态