Django,从主列表中排除,但可以从Django过滤器中查看

问题描述 投票:1回答:1

我正在尝试将存档部分添加到我的站点,但是当我说存档时,我的意思是只是在主页的主列表视图中不可见,该站点很小,而项目只是少量文本因此永远不需要空间和优化。我使用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”。

django django-views django-filter
1个回答
1
投票

一种可能的解决方案是仅在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}
        )
© www.soinside.com 2019 - 2024. All rights reserved.