我正在尝试将存档部分添加到我的站点,但是当我说存档时,我的意思是只是在主页的主列表视图中不可见,该站点很小,而项目只是少量文本因此永远不需要空间和优化。我使用django-filter按部门(在我的代码中为Area)搜索项目,并且“ Archive”作为部门之一而关闭。我已经尝试在queryset中使用exclude,但是当然,这只是完全删除了所有具有area =“ Archive”的项目,因此“ Archive”部分为空。如何将归档项目从主列表视图中删除,但可以通过过滤器进行搜索。
查看:
def project_list_view(request):
project_list = Project.objects.annotate(
display_date = models.Case(
models.When(models.Q(staff_trials__isnull=True) | models.Q(timeline_switch=False), then=models.F('launch')),
models.When(models.Q(staff_trials__isnull=False) & models.Q(timeline_switch=True), then=models.F('staff_trials')),
output_field=models.DateField(),
)
).exclude(area='1').order_by('-slip', 'display_date')
project_filter = ProjectFilter(request.GET, queryset=project_list)
return render(
request,
'project_portal/project_list.html',
{'filter': project_filter}
)
过滤器:
class ProjectFilter(django_filters.FilterSet):
class Meta:
model = Project
fields = ['area', 'user']
[为了清楚起见,Area拥有自己的模型,并且具有Project模型的外键,而部门只是数据库中的条目。上面的代码可以满足我的要求,但是如前所述,使归档项目无法以任何方式访问,而我希望它们显示是否从搜索下拉列表中选择了“ Archive”。
一种可能的解决方案是仅在exclude
过滤器不等于已归档的情况下,才将area
添加到查询集中:
def project_list_view(request):
project_list = Project.objects.annotate(
display_date = models.Case(
models.When(models.Q(staff_trials__isnull=True) | models.Q(timeline_switch=False), then=models.F('launch')),
models.When(models.Q(staff_trials__isnull=False) & models.Q(timeline_switch=True), then=models.F('staff_trials')),
output_field=models.DateField(),
)
).order_by('-slip', 'display_date')
if request.GET.get('area') != '1':
project_list = project_list.exclude(area='1')
project_filter = ProjectFilter(request.GET, queryset=project_list)
return render(
request,
'project_portal/project_list.html',
{'filter': project_filter}
)