Django, исключить из основного списка, но можно просмотреть из фильтра django - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь добавить раздел архива на свой сайт, хотя когда я говорю «архив», я имею в виду, что он просто не виден в главном представлении списка, то есть на домашней странице, сайт маленький, а проекты - это небольшие объемы. текст, поэтому пространство и оптимизация никогда не понадобятся. Я использую django -фильтр для поиска проектов по отделам (область в моем коде), и «Архив» не работает как один из отделов. Я пытался использовать исключение в наборе запросов, но, конечно, он просто полностью удаляет все проекты с 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 есть своя собственная модель с внешним ключом для модели проекта, а отделы просто Записи в базе данных. Приведенный выше код делает то, что я хочу, но, как упоминалось ранее, архивированные проекты становятся недоступными, в то время как я хочу, чтобы они показывали, если в выпадающем списке поиска выбран «Архив».

1 Ответ

1 голос
/ 20 февраля 2020

Одним из возможных решений является добавление 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}
        )
...