【问题标题】:django-filter and django-tables2 only show rows were boolean = truedjango-filter 和 django-tables2 只显示行是 boolean = true
【发布时间】:2021-04-22 17:24:35
【问题描述】:

我一直试图弄清楚如何使用 Django-filter 和 Django-tables2 仅显示表中列值设置为 true 的行,但我似乎无法使代码正常工作。

我能够生成表格并生成过滤器,但根据谁登录到应用程序,我只想显示“is_reviewed”列设置为 true 的记录。

我以为我在 views.py 文件中使用以下行让它工作了,但后来发现它根本没有将过滤器应用于我的查询集:

            # only show scenarios that have been reviewed and published, or scenarios that the user submitted.
            # self.table_data = self.table_data.filter(Q(is_reviewed=True) | Q(submitter = request.user)).order_by("-id")

https://github.com/alexandroidii/cst8333

这是我目前所拥有的:

Views.py

class FilteredScenarioListView(SingleTableMixin, FilterView):
    model = Scenario
    template_name = "rlcs/scenario_list.html"
    table_pagination = {'per_page': 5}
    ordering = '-id'
    
    def get(self, request, *args, **kwargs):
        is_reviewer = request.user.groups.filter(name='reviewer').exists() or request.user.is_superuser
        
        if is_reviewer:
            self.table_class = ReviewerScenarioTable
            self.form_class = ReviewerScenarioFilterForm
            self.filterset_class = ReviewerScenarioFilter
        elif request.user.is_authenticated:
            self.table_class = SubmitterScenarioTable
            # only show scenarios that have been reviewed and published, or scenarios that the user submitted.
            # self.table_data = self.table_data.filter(Q(is_reviewed=True) | Q(submitter = request.user)).order_by("-id")
            self.form_class = SubmitterScenarioFilterForm
            self.filterset_class = SubmitterScenarioFilter
        else:
            self.table_class = SubmitterScenarioTable
            # only show scenarios that have been reviewed and published
            # self.table_data = self.table_data.filter(is_reviewed=True).order_by("-id")
            self.form_class = SubmitterScenarioFilterForm
            self.filterset_class = SubmitterScenarioFilter


        return super().get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['activePage'] = 'scenarios'

        return context

    def get_filterset(self, *args, **kwargs):
        filterset = super().get_filterset(*args, **kwargs)
        # is_reviewer = self.request.user.groups.filter(name='reviewer').exists() or self.request.user.is_superuser
        # qs = Scenario.objects.filter(invoice_owner__username=self.request.user).order_by('invoice_due_date')
        filterset.filters['is_reviewed'].field.queryset = filterset.filters['is_reviewed'].field.queryset.filter(Q(is_reviewed=True) | Q(submitter = self.request.user))
        return filterset

filters.py

class ReviewerScenarioFilter(django_filters.FilterSet):
    industry_type = ModelChoiceFilter(queryset=IndustryType.objects.all(), empty_label=(''))
    bribe_initiator = ModelChoiceFilter(queryset=BribeInitiator.objects.all(), empty_label=(''))
    bribe_facilitator = ModelChoiceFilter(queryset=BribeFacilitator.objects.all(), empty_label=(''))
    bribe_recipient = ModelChoiceFilter(queryset=BribeRecipient.objects.all(), empty_label=(''))
    bribe_type = ModelChoiceFilter(queryset=BribeType.objects.all(), empty_label=(''))
    levelOfAuthority = ModelChoiceFilter(queryset=LevelOfAuthority.objects.all(), empty_label=(''))
    reviewer = ModelChoiceFilter(queryset=User.objects.all().filter(is_reviewer=True), empty_label=(''))
    # is_reviewed = django_filters.BooleanFilter(field_name='is_reviewed', lookup_expr='True')

    class Meta:
        model = Scenario
        form = ReviewerScenarioFilterForm
        fields = {
                    'country',
                    'region',
                    'location',
                    'company_name',
                    'scenario_summary',
                    'scenario_details',
                    'email',
                    'industry_type',
                    'levelOfAuthority',
                    'industry_type',
                    'bribe_initiator',
                    'bribe_facilitator',
                    'bribe_recipient',
                    'bribe_type',
                    'reviewer',
                    'submitted_date',
                    'is_reviewed',
                    'submitter',
        }
        filter_overrides = {
        models.CharField: {
            'filter_class': django_filters.CharFilter,
            'extra': lambda f: {
                'lookup_expr': 'icontains',
            },
        },
        models.EmailField: {
            'filter_class': django_filters.CharFilter,
            'extra': lambda f: {
                'lookup_expr': 'icontains',
            },
        },
        models.TextField: {
            'filter_class': django_filters.CharFilter,
            'extra': lambda f: {
                'lookup_expr': 'icontains',
            },
        },
    }

tables.py

class ReviewerScenarioTable(tables.Table):
    class Meta:
        model = Scenario
        attrs = {"class": "table table-hover table-striped table-bordered"}
        #Clickable Row - Add class clickable-row and data-href=url
        row_attrs = {
            'data-href': lambda record: record.get_absolute_url,
            'class': 'clickable-row',
        }
        fields = (
            "id",
            "country",
            "company_name", 
            "industry_type",
            "scenario_summary",
            "bribe_type",
            "bribe_initiator",
            "bribe_facilitator",
            "bribe_recipient",
            "levelOfAuthority",
            "submitted_date",
            "first_occurence",
            "resolution_date",
            "email",
            "reviewer",
            'is_reviewed',
            )
        exclude = (
            "scenario_details", 
            "risks",
            "resolution",
            "bribe_initiator_other",
            "bribe_facilitator_other",
            "bribe_recipient_other",
            "bribed_by",
            "bribe_type_other",
            "industry_type_other",
            "reviewed_date",
            "submitter",
            "anonymous",
            "is_training_scenario",
            )

    def render_id(self, value, record):
        return value

【问题讨论】:

    标签: python django filter django-tables2 django-filters


    【解决方案1】:

    FilterSets 适用于您提供给它们的任何查询集,因此您只需预先过滤 get_queryset 中的记录:

    class FilteredScenarioListView(SingleTableMixin, FilterView):
        ...
        def get_queryset(self):
            return Scenario.objects.filter(Q(is_reviewed=True) | Q(submitter = self.request.user))
    

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多